The source for the State
transformer in mtl州:
-- ---------------------------------------------------------------------------
-- Instances for other mtl transformers
--
-- All of these instances need UndecidableInstances,
-- because they do not satisfy the coverage condition.
什么是“覆盖条件”?我只能说它与MTPC和fundeps有关。
答案 0 :(得分:15)
the GHC manual的第7.6.3.2节告诉我们覆盖条件是什么:
覆盖条件。对于类的每个函数依赖项
tvsleft -> tvsright
,S(tvsright)
中的每个类型变量都必须出现在S(tvsleft)
中,其中S
是映射类声明中每个类型变量的替换到实例声明中的相应类型。
简单来说,这意味着如果你有一个带有fundeps的类型类,例如:
class Convert a b | a -> b where
convert :: a -> b
您可以定义以下实例:
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
但不以下情况:
instance Convert String a -- a only present on the right
instance Convert a (a,b) -- b only present on the right
答案 1 :(得分:3)
由Simon Peyton-Jones在this paper中定义。定义7定义Coverage Condition
。我会引用确切的定义但唉,我不知道如何在这里重现数学符号。