[Haskell-cafe] groupBy without Ord?

Brent Yorgey byorgey at seas.upenn.edu
Sat Mar 22 17:16:58 UTC 2014


On Sat, Mar 22, 2014 at 05:51:55PM +0100, martin wrote:
> Hello all,
> 
> when I groupBy a list in order to cluster elements which satisfy some sort of equality, I usually have to sort the list
> first, which requires Ord. However groupBy itself does not require Ord, but just Eq.
> 
> How can I groupBy a List whose elements are only instances of Eq but not of Ord?

Well, you can just call groupBy on it. =) But I assume you mean that
you still want to group together all equal elements.  You could do
something like

  groupEq [] = []
  groupEq (a:rest) = (a:as) : groupEq bs
    where (as,bs) = partition (==a) rest

and you could easily generalize it to take a binary predicate, like groupBy, as well.

If you want to get a little fancier and avoid the explicit recursion,
you can use Data.List.Split.chop (from the 'split' package), which
provides a generic way of recursively processing a list:

  chop :: ([a] -> (b,[a])) -> [a] -> [b]

like so:

  import Data.List.Split (chop)
  import Control.Arrow (first)

  groupEq = chop (\(a:rest) -> first (a:) (partition (==a) rest))

-Brent


More information about the Haskell-Cafe mailing list