
Sorry to be picky but there is no violation of the FD here. Note that the class D has only a single ground instance and to violate an FD you need at least two.
perhaps you are thinking of functional dependencies as being defined extensionally, over the extent of the type relations specified by multiparameter type classes? somewhat counterintuitively, this isn't quite the case (just as instance selection doesn't take contexts into account..). to get an FD conflict, it is sufficient to have two conflicting constraints, no need for any instances. consider module Fail(Fail) where class X a class X a => Fail a module Main where import Fail class C a b | a -> b instance Fail a => C [a] Bool since superclass X has no instances and is not exported from module Fail, class Fail, though exported, can have no instances. so the instance declaration given for C seems entirely useless, as far as the relation over types is concerned - there are no ground instances of C. nevertheless, it is taken into account when considering functional dependencies: Hugs: :t undefined :: C [a] b => (a,b) undefined :: C [a] Bool => (a,Bool) and so adding an instance for 'C [a] Char' would lead to an FD conflict. just checking, claus