[Haskell-cafe] an advanced foldification problem

Henning Thielemann lemming at henning-thielemann.de
Thu Jan 11 12:57:25 EST 2007


On Thu, 11 Jan 2007, Seth Gordon wrote:

> I have a data type "Group", representing a group of geographic
> information that is all referring to the same location, and a function
> "mergeGroups" that tries to merge two groups:
> 
>     mergeGroups :: Group -> Group -> Maybe Group
> 
> Then I have a function "mergeGroupToList" that tries to merge its first
> argument with every element of the second argument:
> 
>     mergeGroupToList :: Group -> [Group] -> [Group]
>     mergeGroupToList g [] = [g]
>     mergeGroupToList g1 (g2:gs) =
>         case (mergeGroups g1 g2) of
>         Nothing -> g2 : (mergeGroupToList g1 gs)
>         Just g3 -> mergeGroupToList g3 gs

Is mapAccumL also allowed?

Untested but type-checked:

mergeGroupToList g0 gs =
  let (mergedG, unmergedGs) =
         mapAccumL (\g1 g -> maybe (g1, Just g) (\g3 -> (g3, Nothing)) (mergeGroups g1 g)) g0 gs
  in  catMaybes unmergedGs ++ [mergedG]


More information about the Haskell-Cafe mailing list