Section 7.6.3.2 of the GHC manual tells us what the coverage condition is:
The Coverage Condition. For each functional dependency, tvsleft -> tvsright
, of the class, every type variable in S(tvsright)
must appear in S(tvsleft)
, where S
is the substitution mapping each type variable in the class declaration to the corresponding type in the instance declaration.
In plain English, this means that if you have a type class with fundeps, for example:
class Convert a b | a -> b where
convert :: a -> b
you can define the following instances:
instance Convert String String -- no type variables
instance Convert [a] [a] -- type var a present on both sides
instance Convert (a,b) a -- a on the right => a on the left
but not the following instances:
instance Convert String a -- a only present on the right
instance Convert a (a,b) -- b only present on the right