Matt Fenwick
Matt Fenwick

Reputation: 49085

Is there a standard library solution to this Haskell problem?

I want to use Data.List.groupBy to group a list of tuples based on the equality of the snd element.
I could do this:

groupBy (\l r -> snd l == snd r) listOfTuples

But it strikes me as too much boilerplate in the comparison function -- especially because it could get a lot more messy if I were doing a more complicated comparison. I would like to do something like:

groupBy (comparing snd) listOfTuples

but the type signature of comparing is comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering, so it doesn't compile in this example.
I could also do:

groupBy (\l r -> (comparing snd l r) == EQ) listOfTuples

But this is no better than the first try. Is there a standard-library solution to this problem, before I roll-my-own?

Upvotes: 5

Views: 191

Answers (2)

nulvinge
nulvinge

Reputation: 1598

Is this what you want?

groupBy ((==EQ) . comparing snd) listOfTuples

Upvotes: -1

Daniel Wagner
Daniel Wagner

Reputation: 152707

groupBy ((==) `on` snd) listOfTuples

I think there used to be equating = on (==) in the standard libraries, though I can't seem to find it now.

Upvotes: 15

Related Questions