为什么这违反了"覆盖条件"

时间:2014-08-21 20:52:04

标签: haskell

阅读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是每种类型的替换映射   类声明中的变量到实例声明中的相应类型。

前面的例子似乎满足了这个定义。我知道它不是,但我不明白为什么(我可能并不是真的理解它)。

1 个答案:

答案 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]中。