The source for the State
transformer in mtl states:
-- ---------------------------------------------------------------------------
-- Instances for other mtl transformers
--
-- All of these instances need UndecidableInstances,
-- because they do not satisfy the coverage condition.
What is the "coverage condition"? All I can tell is that it has something to do with MTPCs and fundeps.
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 inS(tvsright)
must appear inS(tvsleft)
, whereS
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