
On 01/21/2015 07:23 PM, Jeffrey Brown wrote:
data Dirn = Succ | Pred deriving (Eq, Show, Ord)
When you "derive" a typeclass instance, you get it magically for free. So you don't need to do this:
-- implement Ord (<=) Succ Pred = False (<=) _ _ = True
But if I try to define the Rev instance the same way the Ord instance is being defined, it does not compile:
... deriving (Eq, Show, Ord, Rev)
But you can't derive classes that you've defined yourself, it only works for predefined ones. (That's how the compiler can do it magically.) So "deriving (Rev)" won't work, because you made the "Rev" typeclass yourself. In the second case, you have to do: instance Rev Dirn where rev Succ = Pred rev Pred = Succ because you can't derive Rev, because it isn't a predefined typeclass. One more thing: when "deriving (Ord)", the compiler uses the order that you've typed the constructors in. So actually, the derived instance would have Succ <= Pred, probably not what you want. I'd switch it to "Pred | Succ" if I were you. The details of why all this failed in a confusing way have been explained in the other responses.