
Dougal Stanton, Thu, 9 Aug 2007 16:57:26 +0100:
Is there a reason why automatic derivation of Ord without Eq doesn't do "the sensible thing" and just derive Eq anyway?
newtype Id a = Id { a :: String } deriving (Read, Show, Eq, Ord) newtype Ego a = Ego { b :: String } deriving (Read, Show, Ord)
Both will type check, but if you try any (in)equality operators on the second they'll be spat back at you.
According to the output of ghci's info command, deriving Ord without deriving Eq is equivalent to instance Eq Ego => Eq Ord where ... That is, if there's an Eq instance declaration for Ego, then Ego will be an instance of Ord, too. This may come in handy if you want to declare the Eq instance yourself, possibly even in another module. The compiler cannot know about instances you're up to declare in other places, so it would probably not be convenient for the compiler to derive Eq behind the scenes.
It doesn't seem *much* of a hardship, but it wasn't what I expected. I'm not used to GHC accepting input and silently dropping stuff it doesn't like...
Well, obviously, you will still get a type error when trying to use the instance without an Eq instance declaration, so it is not really a matter of “silently dropping stuff”, I suppose. Malte