Standard module List defines:
-- group splits its list argument into a list of lists of equal, adjacent
-- elements. e.g.,
-- group "Mississippi" == ["M","i","ss","i","ss","i","pp","i"]
group :: (Eq a) => [a] -> [[a]]
group = groupBy (==)
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy eq [] = []
groupBy eq (x:xs) = (x:ys) : groupBy eq zs
where (ys,zs) = span (eq x) xs
In my programs, I often use the following function to compute
equivalence classes:
eqClasses :: Eq a => [a] -> [[a]]
eqClasses = eqClassesBy (==)
eqClassesBy :: (a -> a -> Bool) -> [a] -> [[a]]
eqClassesBy eq [] = []
eqClassesBy eq (x : xs) =
(x : p) : (eqClassesBy eq p')
where
(p, p') = partition (eq x) xs
There is a single difference: The use of span vs. partition, i.e.
grouping and computing equivalence classes are very similiar. Indeed,
if a set is represented by a sorted list, grouping can be used to
compute its equivalence classes efficiently.
Michael Marte