# what's the difference?

**Emre Tezel
**
emre.tezel@verizon.net

*Thu, 11 Jul 2002 20:27:30 -0400*

Cagdas Ozgenc wrote:
>* Greetings.
*>*
*>*
*>*
*>* What is the difference between the following two scenarios:
*>*
*>*
*>*
*>* 1)
*>*
*>*
*>*
*>* class Eq a where
*>*
*>* (==) :: a -> a -> Bool
*>*
*>*
*>*
*>* class Eq a => Ord a where
*>*
*>* ( < ) :: a -> a -> Bool
*
Here you are doing subtyping. A variable of type Ord can be substitued
for variable of type Eq. (==) belongs to Ord interface.
>*
*>*
*>*
*>* 2)
*>*
*>*
*>*
*>* class Eq a where
*>*
*>* (==) :: a -> a -> Bool
*>*
*>*
*>*
*>* class Ord a where
*>*
*>* (eq),( < ) :: a -> a -> Bool
*>*
*>*
*>*
*>* instance Ord a => Eq a where
*>*
*>* (==) = eq
*
Here Ord is not a subtype of Eq. Even (eq) and (==) have the same
definition, (==) is not part of Ord's interface. You are doing
delegation. For those instances of Eq who happens to implement Ord
interface, delegate (==) to (eq).
The second case is similar to private inheritance in C++. You are
overiding the virtual (==) of base class (Eq) in the derived class
(Ord), but (==) is not part of derived class' interface.
>*
*>*
*>*
*>* eq is just a rename for == to avoid the nameclash
*>*
*>*
*>*
*>* The second scenario resembles Russell's Paradox. Typeclass of a
*>* typeclass. Anyhow we are loosing orthogonality here.
*>*
*>*
*>*
*>* Thanks
*>*
*