GHC 手册的第 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