[Haskell-cafe] Comparing on multiple criteria

David Menendez dave at zednenem.com
Sun Dec 21 18:47:41 EST 2008


On Sun, Dec 21, 2008 at 11:20 AM, Jan-Willem Maessen
<jmaessen at alum.mit.edu> wrote:
> On Dec 21, 2008, at 8:52 AM, Martijn van Steenbergen wrote:
>
>> Hello all,
>>
>> Data.Ord has a handy function called comparing, and its documentation
>> shows an example of its use.
>>
>> But what if you want to sort a list of values based on multiple criteria?
>> It turns out there is a neat way to do this:
>>
>> compareTuple = mconcat [comparing fst, comparing snd]
>>
>> The default Monoid instances for Ordering and functions work exactly as
>> required here. (Thanks to vixey in #haskell for the hint to look at
>> monoids!)
>
> Indeed, this is great to know.  I can't help but notice that there is no
> documentation of any kind at all for the Monoid instance of Ordering; how
> were we supposed to know this behavior existed in the first place, except by
> hunting down the source code for the instance declaration?

This is a great example of why it's a bad idea to introduce new
functionality with a Monoid instance. Even if you know the instance
exists, mappend is so general that it's difficult or impossible to
predict what it will do at a given type.

There should be an explicit function for combining Ordering values
lexicographically, with a note in the documentation saying that it's
the basis of the Monoid instance.

-- 
Dave Menendez <dave at zednenem.com>
<http://www.eyrie.org/~zednenem/>


More information about the Haskell-Cafe mailing list