阅读UndecidableInstances
我理解this question中的问题与以下内容相同:
class Convert a b | a -> b where
convert :: a -> b
instance Convert a b => Convert [a] [b] where
convert = map convert
我理解为什么' UndecidableInstance'是必要的和(种类)为什么类型检查器可以循环在某些情况下。但是,我仍然不了解它是如何违反“覆盖条件”的。我的意思是,当我读到定义时
对于类的每个函数依赖项
tvsleft -> tvsright
,每个类型变量都在S(tvsright)
必须出现在S(tvsleft)
中,其中S
是每种类型的替换映射 类声明中的变量到实例声明中的相应类型。
前面的例子似乎满足了这个定义。我知道它不是,但我不明白为什么(我可能并不是真的理解它)。
答案 0 :(得分:3)
我猜你喜欢我,你首先认为tvsleft
与实例中=>
左边的部分有关。但仔细阅读后,我发现它没有。至少对于此示例,这仅限于实例 head 。
对于头部为Convert a b
且功能依赖性a -> b
的类,我们有
tvsleft = a
tvsright = b
对于实例,我们必须替换类头Convert a b
中的变量来获取实例头Convert [a] [b]
,给出
S(tvsleft) = S(a) = [a]
S(tvsright) = S(b) = [b]
且b
中的类型变量[b]
未出现在[a]
中。