Brian Hulley wrote:
<snip>
Another confusing thing is the use of the word "inheritance" in
tutorials/books about class declarations. Unlike object oriented
languages, where a class or interface gets all the methods of its
ancestor classes/interfaces in addition to some new methods declared
at that level, each Haskell type class is completely independent of
any other type class. For example, the class Ord contains methods for
(<) (<=) (>=) (>) max min but does not contain the methods of Eq even
though this confusing word "inheritance" or "superclass" would imply
that it should. Ord does *not* "inherit" anything at all - the
meaning of the Eq context in the class declaration is just that we
will need the Eq dictionary in addition to the Ord dictionary when
calling any of Ord's methods.
Thus I propose that the contexts don't really have any place in a
class declaration either ie

  class Eq a => Ord a where
          (<), (<=), ... ::

would be better written as:

    class Ord a where
          (<), (<=), .... :: Eq a => a->a->Bool

so the language wouldn't be so confusing to learn. Classes are after
all extremely simple! :-)

Sorry folks I've got all this completely wrong! ;-)
It seems the Ord dictionary does in fact contain the Eq dictionary since the following examples compile:

test :: Ord a => a->a->Bool
test x y = x <= y

test2 :: Ord a => a->a->Bool
test2 x y = x == y

I think what confused me was that although the Ord dictionary contains the methods for Eq, you cannot override the Eq methods in an instance declaration for Ord - you have to use two instance declarations to achieve this, one for Ord and one for Eq, so as far as instance declarations are concerned, the type classes are separate, but the dictionaries are not.

Regards, Brian.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to