On Sun, Dec 21, 2008 at 11:20 AM, Jan-Willem Maessen <jmaes...@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 <d...@zednenem.com> <http://www.eyrie.org/~zednenem/> _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe