
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