[Haskell-cafe] A bug of groupBy implement

Stephen Tetley stephen.tetley at gmail.com
Mon Dec 7 12:41:47 EST 2009


Hi L.Guo

Brent has replied with the right answer.

The definition of groupBy is below - the span in the where clause only
compares with the first element of the current sub-list:

-- | The 'groupBy' function is the non-overloaded version of 'group'.
groupBy                 :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy _  []           =  []
groupBy eq (x:xs)       =  (x:ys) : groupBy eq zs
                           where (ys,zs) = span (eq x) xs


-- 

list1 = [7,3,5,9,6,8,3,5,4::Int]

Here are two more runs on your input with a wee bit less clutter. In
both cases there are 'spans' where the numbers increase and decrease -
this is because the operation is comparing the rest of the input
against the first element in the 'span' not consecutive elements.


*GroupBy Data.List> groupBy (<) list1
[[7],[3,5,9,6,8],[3,5,4]]



*GroupBy Data.List> groupBy (<=) list1
[[7],[3,5,9,6,8,3,5,4]]


Best wishes

Stephen


More information about the Haskell-Cafe mailing list