You might want to look at the code out there that processes command line options by creating record setting functions, which then are foldl'-ed to create an updated structure. See http://leiffrenzel.de/papers/commandline-options-in-haskell.html at the bottom of the page. I suspect you can easily create a conversion function (of functions) that does what you want.
On Mon, Nov 2, 2009 at 6:38 PM, Evan Laforge <qdun...@gmail.com> wrote: > On Mon, Nov 2, 2009 at 5:29 PM, Magicloud Magiclouds > <magicloud.magiclo...@gmail.com> wrote: > > Hi, > > Say I have something like this: > > [ Record { item = "A1", value = "0" } > > , Record { item = "B1", value = "13" } > > , Record { item = "A2", value = "2" } > > , Record { item = "B2", value = "10" } ] > > How to convert it into: > > [ XXInfo { name = "A", value1 = "0", value2 = "2" } > > , XXInfo { name = "B", value1 = "13", value2 = "10" } ] > > If XXInfo has a lot of members. And sometimes the original data > > might be not integrity. > > This is a function from my library that I use a lot: > > -- | Group the unsorted list into @(key x, xs)@ where all @xs@ compare > equal > -- after @key@ is applied to them. List is returned in sorted order. > keyed_group_with :: (Ord b) => (a -> b) -> [a] -> [(b, [a])] > keyed_group_with key = map (\gs -> (key (head gs), gs)) > . groupBy ((==) `on` key) . sortBy (compare `on` key) > > -- You can use it thus, Left for errors of course: > > to_xx records = map convert (keyed_group_with item records) > where > convert (name, [Record _ v1, Record _ v2]]) = Right (XXInfo name v1 v2) > convert (name, records) = Left (name, records) > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe