Wie lassen sich große Haskell-Datensätze besser verwalten?

Wenn ich Feldnamen durch Buchstaben ersetze, habe ich Fälle wie diesen:

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

Welche Techniken würden es mir ermöglichen, dieses Wachstum besser zu bewältigen?

n einer perfekten Wea, b, undc wäre alle der gleiche Typ, so dass ich sie in einer Liste behalten könnte, aber es können viele verschiedene Typen sein. Ich bin besonders daran interessiert, die Aufzeichnungen zu falten, ohne die massiven Muster zu benötigen.

Ich verwende diesen großen Datensatz, um die verschiedenen Typen zu speichern, die sich aus @ ergebepermutation parst das vCard-Format.

Aktualisiere

Ich habe sowohl die @ implementie generics und die foldl Ansätze unten vorgeschlagen. Sie arbeiten beide, und sie reduzieren beidedrei große Feldlisten zu eins

Antworten auf die Frage(4)

Ihre Antwort auf die Frage