[Haskell-cafe] How to convert records into Haskell structure in Haskell way?

2009-11-02 Thread 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.
-- 
竹密岂妨流水过
山高哪阻野云飞
___
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?

2009-11-02 Thread Daniel Fischer
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?

2009-11-02 Thread Evan Laforge
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