Систематическое применение функции ко всем полям записи в Haskell
У меня есть запись с полями разных типов и функция, которая применима ко всем этим типам. В качестве небольшого (глупого) примера:
data Rec = Rec { flnum :: Float, intnum :: Int } deriving (Show)
Скажем, я хочу определить функцию, которая добавляет две записи для каждого поля:
addR :: Rec -> Rec -> Rec
addR a b = Rec { flnum = (flnum a) + (flnum b), intnum = (intnum a) + (intnum b) }
Есть ли способ выразить это без повторения операции для каждого поля (в записи может быть много полей)?
На самом деле у меня есть запись, состоящая исключительно изMaybe
поля, и я хочу объединить фактические данные с записью, содержащей значения по умолчанию для некоторых полей, которые будут использоваться, когда фактические данные былиNothing
.
(Я думаю, это должно быть возможно с шаблоном haskell, но меня больше интересует «переносимая» реализация.)