
Ashley Yakeley writes: [...]
Subtyping-overlapping is quite different from type-substitution overlapping.
Different, but with some similarities.
Consider:
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') Regards, Tom