Функция для возврата записи на Haskell с измененным полем - PullRequest
12 голосов
/ 03 мая 2011

Учитывая :

data MyRecord a = MyRecord{list :: [a], other_fields :: Char, …}

Я пытаюсь написать функцию, которая помещает новый a в список и возвращает новый MyRecord:

pushOntoList :: a -> MyRecord -> MyRecord

Вопрос :

Есть ли способ написать pushOntoList - это такой способ, что он не зависит от того, что находится в остальной части записи, а просто возвращает его обратнонемодифицированный?

Еще один вопрос: можете ли вы написать pushOntoList, не видя остальной части определения MyRecord?

1 Ответ

19 голосов
/ 03 мая 2011

Да, очень легко с помощью синтаксиса доступа к записи / метки:

b = a { list = 'x' : list a }

как в функции:

pushOntoList c a = a { list = c : list a }

, например

data MyRecord a = MyRecord {list :: [a], other_fields :: Char}
    deriving Show

main = do
    let a = MyRecord [] 'x'
        b = a { list = 'x' : list a }
    return (a,b)
...