
On Thu, 2 Nov 2006, Nils Anders Danielsson wrote:
The function on defined by
(*) `on` f = \x y -> f x * f y
is convenient when using functions like sortBy: sortBy (compare `on` fst), for example. It also makes the code more readable.
Furthermore I consider on to be above the Fairbairn threshold, since * we get rid of two lambdas, * we get rid of the duplication of p, * on has some nice algebraic properties (documented in the patch) * and, most importantly, it is easier at a glance to understand (*) `on` p than to understand \x y -> p x * p y (assuming one knows about on).
This reminds me on an earlier discussion: http://www.haskell.org/pipermail/libraries/2005-March/003431.html I expect, that all constructs of a "*By" list function with "on" and "comparing" are only efficient, if "f" is cheap. That's why I have defined functions and called them *Key functions, which buffer the results of "f". I attached the Key suffix in order to show that these functions sort, group, remove duplicates and so on with respect to a key. I called my "on" "composeDouble": http://cvs.haskell.org/darcs/htam/src/Useful.hs