[Haskell-beginners] Re: Problem "grouping" a list

Hein Hundal hundalhh at yahoo.com
Thu Nov 25 10:02:44 EST 2010


> From: Jo?o Paulo Pizani Flor <joaopizani at gmail.com>
> OK, so my specific problem goes like this: I have a list of
> tuples
> :t  myList
> [ (Float, Integer) ]
> 
> And I want to "group" this list into a nested list
> groupAtoms :: [ (Float,Integer) ]  ->  [
> [(Float,Integer)] ]
> 
> Of course, I want that the concatenation of the groups
> yield me the original
> list, i.e,  (foldl (++) [] . groupAtoms == id), and
> the criterion that
> defines a group is that:
> "The sum of the first elements in the tuples comprising the
> list must be
> greater than or equal to 1.0". 

Jo?o,
   I am a beginner also and I liked Daniel Fischer's solution.  Here is another (less elegant) solution:

-- Start Code Here

-- foldfun takes an existing list of lists of pairs and decides
-- whether to append p to the current list, pl, or start a new 
-- list of pairs. 

foldfun done p (pl:pls) = if done pl then [p]:pl:pls else (p:pl):pls
foldfun done p [] = [[p]] 

-- mygroup2 folds list of pairs, pl, using the foldfun, and then 
-- puts all the lists in the correct order using reverse twice.

mygroup2 pl = map reverse $ reverse $ 
                  foldr (foldfun done) [] (reverse pl)  
  where done pl = sum (map fst pl) >= 1.0

-- End of Code



Cheers,
Hein





      


More information about the Beginners mailing list