Fergus Henderson <fjh@cs.mu.oz.au> writes:
(It would be good for someone, perhaps Simon P-J., to keep a list of issues like this which have been left out of Haskell 98 due to backwards compatibility concerns, so that they don't get forgotten about when it comes to time for the next version.)
Such a list would indeed be useful but I think it's important that the list should record that there are reasons besides backwards compatability for leaving things as they are. IIRC, at the time that the functions were added to List, someone proposed generalisations like those currently on the table but they were rejected because they made it harder to state the relationship between the By functions and their overloaded brethren. With things as they are now, the relationship between the By functions and their overloaded variants is very, very simple to state: if foo has type foo :: (Eq a) => ty then fooBy has type fooBy :: (a -> a -> Bool) -> ty (where the additional argument is expected to be an equivalence relation) and foo = fooBy (==) and if foo has type foo :: (Ord a) => ty then fooBy has type fooBy :: (a -> a -> Bool) -> ty (where the additional argument is expected to be an reflexive, transitive relation) and foo = fooBy (<=) Making the types of the By functions as general as possible would break the consistency of this story. -- Alastair Reid reid@cs.utah.edu http://www.cs.utah.edu/~reid/