Instance instantiation is *not* search, and *not* similar to subclassing in OO languages. Both your instance declarations simply add constraints to functions that use it. Here's a more concrete example: class A a where doA :: a -> String class R a where doR :: a -> String instance R Int where doR = show instance R a => A a where doA = doR question x = doA x The question is, what is the type of "question"? Here are two valid choices with this program: question :: (A a) => a -> String question :: (R a) => a -> String The instance R a => A a says that every type "a" is an instance of "A"; if an instance for A is needed, the compiler says "OK, I know how to make one of those. But I now add a new constraint, R a." Adding another instance S a => A a makes the choice of what constraint to add ambiguous. In particular the following code does *not* work: class S a where doS :: a -> String instance S String where doS = id instance S a => A a where doA = doS question2 = question (2::Int) question3 = question "3" In my experience, if you are turning undecidable instances on and you don't know exactly why it's safe to do so, there is probably a mistake in your design. -- ryan 2008/10/24 Alberto G. Corona <agocorona@gmail.com>:
with:
{-# OPTIONS -fglasgow-exts -fallow-undecidable-instances #-}
class A a class R a
class S a
instance R a => A a
instance S a => A a
GHC gives
Duplicate instance declarations instance R a => A a instance S a => A a
Why? _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe