haskell - newbie question
$ cat test.hs
data Data = Data { dString :: String, dFloat :: Float } deriving (Show)
main :: IO
main = do
let d = Data "string" 0.1
putStrLn . show $ d { dString = "new string" }
putStrLn . show $ d { dFloat = 1.3 }
$ runhaskell test.hs
Data {dString = "new string", dFloat = 0.1}
Data {dString = "string", dFloat = 1.3}
пытался по аналогии написать как у тебя
f x = x {SomeField = 12}
ругается на несоответствие типов. Что, в принципе, ожидаемо. Я, видимо, как-то не так тебя понял. Можешь дать на описание фичи? А то я сам найти не смог
f x = x {SomeField = 12}и не должно, хуле здесь думать
а что тогда мне советовал предыдущий оратор, можешь объяснить?
data Data = Data { field1 :: Type1, field2 :: Type2, field3 :: Type 3}
e1 = Data { field1 = <inst1>, field2 = <inst2>, field3 = <inst3> }
e2 = e1 { field2 = <inst2'> }
e3 = e1 { field3 = <inst3'> }
ну то есть здесь e2 и e3 получаются из e1 заменой field2 и field3 соотв. на другие значения
а что в моём варианте тогда неправильно? Что я применил конструкцию к результату pattern matchingа?
подумай уже сам - там же всё очевидно.
всё, нашёл у себя лишнее слово. До экстешенов я в своих поисках не добрался ещё. Придётся теперь читать
Оставить комментарий
yroslavasako
Я уже порядком утомился пользоваться алгебраическими типами данных с именованными полями. По старой объектнориентированной памяти пользуюсь объявлением data и регулярно объединяю разрозненные данные в один Record. Вот только беда - для каждого поля этой записи потом приходится писать процедуру udpateSomeField :: Record->Field->Record - чтобы получать экземпляр записи, отличающийся только одним полем. И это занятие меня уже порядком подзаебло. Может есть какая-то стандартная методика обхода указанной проблемы или синтаксический сахар?