How to convert records into Haskell structure in Haskell way?

View: New views
5 Messages — Rating Filter:   Alert me  

How to convert records into Haskell structure in Haskell way?

by Magicloud Magiclouds :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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@...
http://www.haskell.org/mailman/listinfo/haskell-cafe

Re: How to convert records into Haskell structure in Haskell way?

by Daniel Fischer-4 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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@...
http://www.haskell.org/mailman/listinfo/haskell-cafe

Re: How to convert records into Haskell structure in Haskell way?

by Magicloud Magiclouds :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

This is pretty much it, with one thing left.
I got the original data from outside. Out of no reason, the data could
be incomplete.
For example, XXInfo has two members, this is the correct case. But the
data I got may only contain only one member's information, with the
other one totally lost. Kind like:
[ Record { item = "A1", value = "0" } ]
This is not a legal XXInfo, I have to deal with it.
Plus, there are 28 members of XXInfo, so xxInfo of yours would be very ugly.

On Tue, Nov 3, 2009 at 9:55 AM, Daniel Fischer <daniel.is.fischer@...> wrote:

> 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@...
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



--
竹密岂妨流水过
山高哪阻野云飞
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@...
http://www.haskell.org/mailman/listinfo/haskell-cafe

Re: How to convert records into Haskell structure in Haskell way?

by Evan Laforge :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Mon, Nov 2, 2009 at 5:29 PM, Magicloud Magiclouds
<magicloud.magiclouds@...> 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@...
http://www.haskell.org/mailman/listinfo/haskell-cafe

Re: How to convert records into Haskell structure in Haskell way?

by B. Scott Michel :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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 <qdunkan@...> wrote:
On Mon, Nov 2, 2009 at 5:29 PM, Magicloud Magiclouds
<magicloud.magiclouds@...> 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@...
http://www.haskell.org/mailman/listinfo/haskell-cafe


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@...
http://www.haskell.org/mailman/listinfo/haskell-cafe