| What I don't understand, however, is why adding that extra | constraint helps in any way? Shouldn't the addition of new | things in the context only make more options available? Why | does it make some of the existing, amgibuous options go away?
With the extra constraint, the instance decl can build a C (T a) dictionary from a (C a, C [a]) dictionary, by choosing the expl method from the C [a] dictionary it is passed (ignoring the C a one). That defers the choice of which of the overlapping instance decls we are going to use. Perhaps it'll be postponed to a point at which 'a' is known, in which case the choice is easy. The point is that we don't want to have to choose between the C String and C [a] instance decls until we know enough about 'a' to choose the right one. Simon | data T a = D [a] | | class C t where | expl :: t -> String | expl x = "default" | | instance C String where expl s = "String" | instance C a => C [a] where expl l = "[a]" | | instance (C a {- ,C [a] -} ) => C (T a) where | expl (D xs) = expl xs | | main = putStrLn $ expl "hi" | | ------------ | | As is, both ghc and hugs reject the program, whereas | both accept it with the extra constraint in the C (T a) | instance.. Now, I think I can see how the right-hand-side | expl could come either from the C String or from the C [a] | instance - hence ghc's message: | | $ ghc --make Tst.hs | c:\ghc\ghc-5.04\bin\ghc.exe: chasing modules from: Tst.hs | Compiling Main ( Tst.hs, ./Tst.o ) | | Tst.hs:15: | Could not unambiguously deduce (C [a]) | from the context (C (T a), C a) | The choice of (overlapping) instance declaration | depends on the instantiation of `a' | Probable fix: | Add (C [a]) to the class or instance method `expl' | Or add an instance declaration for (C [a]) | arising from use of `expl' at Tst.hs:15 | In the definition of `expl': expl xs | | | Confused, | Claus | | PS. Perhaps related, but why does Hugs seem to ignore the | C a constraint in the context of the original version? | | $ hugs -98 Tst.hs | __ __ __ __ ____ ___ | _________________________________________ | || || || || || || ||__ Hugs 98: Based on the Haskell 98 | standard | ||___|| ||__|| ||__|| __|| Copyright (c) 1994-2001 | ||---|| ___|| World Wide Web: | http://haskell.org/hugs | || || Report bugs to: | [EMAIL PROTECTED] | || || Version: December 2001 | _________________________________________ | | Hugs mode: Restart with command line option +98 for Haskell 98 mode | | Reading file "c:\Program Files\Hugs98\\lib\Prelude.hs": | Reading file "Tst.hs": | Type checking | ERROR "Tst.hs":15 - Cannot justify constraints in instance member | binding | *** Expression : expl | *** Type : C (T a) => T a -> String | *** Given context : C (T a) | *** Constraints : C [a] | | Prelude> | _______________________________________________ | Glasgow-haskell-bugs mailing list | [EMAIL PROTECTED] | http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs _______________________________________________ Glasgow-haskell-bugs mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs