[Haskell-cafe] How to convert records into Haskell structure in Haskell way?
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. -- 竹密岂妨流水过 山高哪阻野云飞 ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] How to convert records into Haskell structure in Haskell way?
Am Dienstag 03 November 2009 02:29:56 schrieb Magicloud Magiclouds: 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. Could you be a little more specific about what you want to achieve? As a first guess, you might use something like import Data.List import Data.Ord (comparing) import Data.Function (on) sortedRecords = sortBy (comparing item) records recordGroups = groupBy ((==) `on` (head . item)) sortedRecords -- now comes the tricky part, converting the groups to XXinfo -- if all groups are guaranteed to have the appropriate number of -- elements, you can use xxInfo [Record (c:_) v1, Record _ v2] = XXinfo [c] v1 v2 -- and then xxInfos = map xxInfo recordGroups -- if the groups may have different numbers of elements, it's going to be uglier ___ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Re: [Haskell-cafe] How to convert records into Haskell structure in Haskell way?
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