haskell - newbie question

yroslavasako

Я уже порядком утомился пользоваться алгебраическими типами данных с именованными полями. По старой объектнориентированной памяти пользуюсь объявлением data и регулярно объединяю разрозненные данные в один Record. Вот только беда - для каждого поля этой записи потом приходится писать процедуру udpateSomeField :: Record->Field->Record - чтобы получать экземпляр записи, отличающийся только одним полем. И это занятие меня уже порядком подзаебло. Может есть какая-то стандартная методика обхода указанной проблемы или синтаксический сахар?

conv3rsje

$ 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}

yroslavasako

писал функцию f :: record->record
пытался по аналогии написать как у тебя

f x = x {SomeField = 12}

ругается на несоответствие типов. Что, в принципе, ожидаемо. Я, видимо, как-то не так тебя понял. Можешь дать на описание фичи? А то я сам найти не смог

sergeikozyr

f x = x {SomeField = 12}
и не должно, хуле здесь думать ;)

yroslavasako

а что тогда мне советовал предыдущий оратор, можешь объяснить?

sergeikozyr

 
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 соотв. на другие значения

yroslavasako

а что в моём варианте тогда неправильно? Что я применил конструкцию к результату pattern matchingа?

sergeikozyr

подумай уже сам - там же всё очевидно.

yroslavasako

всё, нашёл у себя лишнее слово. До экстешенов я в своих поисках не добрался ещё. Придётся теперь читать
Оставить комментарий
Имя или ник:
Комментарий: