[Haskell-cafe] A bug of groupBy implement

Brent Yorgey byorgey at seas.upenn.edu
Mon Dec 7 12:20:40 EST 2009


On Mon, Dec 07, 2009 at 12:15:45PM -0500, Brent Yorgey wrote:
> On Tue, Dec 08, 2009 at 12:45:59AM +0800, L.Guo wrote:
> > Hi there:
> > 
> > My friend asked me a question, and i suppose he has found a bug of `groupBy'.
> > 
> > Here is the code piece:
> > 
> > > List.groupBy (\a b -> Foreign.unsafePerformIO (Text.Printf.printf "\t%d <= %d ?: %s\n" a b (show (a<=b)) >> return (a<=b))) [7,3,5,9,6,8,3,5,4]
> > 
> > I have tested it in GHC 6.10.4 (Win XP) and GHC 6.8.3 (Linux), both give the wrong result (categaried):
> > 
> >         7 <= 3 ?: False
> >         3 <= 5 ?: True
> >         3 <= 9 ?: True
> >         3 <= 6 ?: True
> >         3 <= 8 ?: True
> >         3 <= 3 ?: True
> >         3 <= 5 ?: True
> >         3 <= 4 ?: True
> > [[7],[3,5,9,6,8,3,5,4]]
> 
> This looks like the right result to me.  What makes you think it is
> wrong?  What result do you expect?

I just realized I think I understand what the confusion is.  You think it should return

  [[7],[3,5,9],[6,8],[3,5],[4]]?

But in fact, groupBy only works that way for equivalence relations,
where it makes perfect sense to just compare the first thing in each
sublist against all the rest, instead of comparing each pair of
adjacent elements.  The behavior you want is something I have been
planning to add to the Data.List.Split module for a while.

-Brent


More information about the Haskell-Cafe mailing list