Подтвердить что ты не робот

Функция для возврата записи Haskell с измененным полем

Учитывая

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

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

pushOntoList :: a -> MyRecord -> MyRecord

Вопрос

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

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

4b9b3361

Ответ 1

Да, очень легко использовать синтаксис accessor/label записи:

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)