问题
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.
回答1:
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
回答2:
It is defined in this paper by Simon Peyton-Jones. Definition 7 defines Coverage Condition
. I would quote the exact definition but alas, I don't know how to reproduce the mathematical symbols here.
来源:https://stackoverflow.com/questions/11959764/what-is-the-coverage-condition