There are many ways you can do it. Here are two. The first uses the Transform List Comp extensions introduced in 6.10.

http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#generalised-list-comprehensions

The second uses more normal Haskell. The second version is probably not the best 'normal' Haskell implementation though.

{-# LANGUAGE TransformListComp #-}

import Data.Function (on)
import Data.List (groupBy)
import GHC.Exts

test :: (Ord a) => [(a, b)] -> [(a, [b])]
test l = [ (the f, s) | (f,s) <- l , then group by f ]

ex1 = test [('a',1),('a',2),('a',3),('b',1),('b',2)]


test2 :: (Ord a) => [(a, b)] -> [(a, [b])]
test2 l =
map (\grp -> (fst (head grp), map snd grp)) ((groupBy ((==) `on` fst)) l)

ex2 = test [('a',1),('a',2),('a',3),('b',1),('b',2)]

On Oct 24, 2009, at 5:27 PM, spot135 wrote:




Ok maybe a noob question, but hopefully its an easy one.

This is what I've got so far:

test :: x->[a] -> (b,[b])
test x arrlist = let test1 = x
                         a = filter (\n -> fst n == test1) arrlist
                        test2 = map snd a
                   in (test1, [test2])

so basically I have a list say [(a,1),(a,2),(a,3),(b,1),(b,2)] etc
So I give the function a x value (a or b) in this case and it return
(a,[1,2,3])

which is all gravy

But,
Is there a way that i dont have to supply the a or b ie i call the function
and it gives me the list
[(a,[1,2,3]),(b,[1,2])...

I presume i need another layer of recursion but I cant figure out how to do
it.

Any help would be gratefully received :-)

--
View this message in context: 
http://www.nabble.com/bit-of-a-noob-question-tp26043671p26043671.html
Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.

_______________________________________________
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

Reply via email to