Как лучше управлять большими записями на Haskell?

Заменив имена полей буквами, у меня есть такие случаи:

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') ...

Какие методы позволят мне лучше управлять этим ростом?

В идеальном миреa, b, а такжеc все они будут одного типа, чтобы я мог хранить их в списке, но они могут быть разных типов. Я особенно заинтересован в том, чтобы сложить записи, не нуждаясь в массивных шаблонах.

Я использую эту большую запись для хранения различных типов, полученных в результатеперестановка синтаксического анализа формата vCard.

Обновить

Я реализовал обадженерики иfoldl подходы, предложенные ниже. Они оба работают, и они оба уменьшаюттри больших списка полей к одному.

Ответы на вопрос(2)

Ваш ответ на вопрос