Qual é a melhor maneira de gerenciar grandes registros Haskell?

Substituindo nomes de campos por letras, tenho casos como este:

data Foo = Foo { a :: Maybe ...
               , b :: [...]
               , c :: Maybe ...
               , ... for a lot more fields ...
               } deriving (Show, Eq, Ord)

instance Writer Foo where
  write x = maybeWrite a ++
            listWrite  b ++
            maybeWrite c ++
            ... for a lot more fields ...

parser = permute (Foo
                   <$?> (Nothing, Just `liftM` aParser)
                   <|?> ([], bParser)
                   <|?> (Nothing, Just `liftM` cParser)
                   ... for a lot more fields ...

-- this is particularly hideous
foldl1 merge [foo1, foo2, ...]
merge (Foo a b c ...seriously a lot more...)
      (Foo a' b' c' ...) = 
        Foo (max a a') (b ++ b') (max c c') ...

Quais técnicas me permitiriam gerenciar melhor esse crescimento?

Em um mundo perfeitoa, bec&nbsp;todos seriam do mesmo tipo para que eu pudesse mantê-los em uma lista, mas eles podem ser de muitos tipos diferentes. Estou particularmente interessado em dobrar os registros sem precisar de padrões massivos.

Estou usando esse grande registro para armazenar os diferentes tipos resultantes depermutação analisando o formato vCard.

Atualizar

Eu implementei tanto ogenéricos&nbsp;e afoldl&nbsp;abordagens sugeridas abaixo. Ambos trabalham, e ambos reduzemtrês grandes listas de campos&nbsp;para um.