Aplicação sistemática de uma função a todos os campos de um registro haskell
Eu tenho um registro com campos de tipos diferentes e uma função que é aplicável a todos esses tipos. Como um pequeno exemplo (bobo):
data Rec = Rec { flnum :: Float, intnum :: Int } deriving (Show)
Digamos, eu quero definir uma função que adicione dois registros por campo:
addR :: Rec -> Rec -> Rec
addR a b = Rec { flnum = (flnum a) + (flnum b), intnum = (intnum a) + (intnum b) }
Existe uma maneira de expressar isso sem repetir a operação para todos os campos (pode haver muitos campos no registro)?
Na realidade, eu tenho um registro composto exclusivamente porMaybe
campos, e quero combinar os dados reais com um registro contendo valores padrão para alguns dos campos, a serem usados quando os dados reais foremNothing
.
(Acho que deveria ser possível com o haskell de modelo, mas estou mais interessado em uma implementação "portátil".)