class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y)Given that the implementation of both functions is given in terms of the other one, an implementor of the typeclass only needs to implement one of the functions, getting the other one "for free." What caught my attention last night is the fact that the only way to know that this is the case for a given typeclass in to either read the source code for the typeclass definition, or hope that the documentation says something about it. In the case of the Eq typeclass, the documentation has the following blip about it:
Minimal complete definition: either == or /=.It seems that currently the compiler is unable to help you know if you have implemented "enough" of a typeclass to make it safe to use. Maybe when my Haskell Kung Fu is stronger I can try to tackle this minor issue.