O'Haskell OOP Polymorphic Functions
Wed, 17 Jan 2001 11:36:06 +1300
Ashley Yakeley writes:
> Subtyping-overlapping is quite different from type-substitution
Different, but with some similarities.
> struct B
> struct D1 < Base =
> a1 :: Int
> struct D2 < Base =
> a2 :: Int
> class TheValue a where theValue :: a -> Int
> instance TheValue B where theValue _ = 0
> instance TheValue D1 where theValue _ = 1
> instance TheValue D2 where theValue _ = 2
> struct M < D1,D2
> m = struct
> a1 = 0
> a2 = 0
> f = theValue m
> What's the value of f?
Undefined, because neither of the overlapping instances is strictly
more specific than the other. I hope that would cause a static error,
anywhere that 'instance TheValue D1', 'instance TheValue D2', and
'struct M' are all in scope together.
Here's a similar example using type-substitution overlapping:
instance TheValue Char where ...
instance Monad m => TheValue (m Char) where ...
instance TheValue a => TheValue (Maybe a) where ...
trouble = theValue (Just 'b')