
oleg@pobox.com:
[...] The above two instances show there exists a model of T where the functional dependency is violated. That's why both GHC 6.4 and Hugs reject the instance. Again, it is a mystery why GHC 6.6 accepts it.
Actually, GHC 6.6 does reject cases like the one discussed in this thread, but the check is not performed at the point of instance declaration. Instead, it is deferred until the point of use. For example:
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}
data Any a = Any
class Foo a b | a -> b where foo :: a -> b instance Foo (Any a) b where foo = undefined
test1 :: Char test1 = foo (Any :: Any Int)
GHC 6.6 compiles the above without error. But add this:
test2 :: Bool test2 = foo (Any :: Any Int)
And we get: Couldn't match expected type `Char' against inferred type `Bool' When using functional dependencies to combine Foo (Any Int) Bool, arising from use of `foo' at fd.hs:16:8-27 Foo (Any Int) Char, arising from use of `foo' at fd.hs:13:8-27