Как лучше управлять большими записями на 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 подходы, предложенные ниже. Они оба работают, и они оба уменьшаюттри больших списка полей к одному.