【问题标题】:Why does this violate the "Coverage Condition"为什么这违反了“覆盖条件”
【发布时间】:2014-08-21 20:52:03
【问题描述】:

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

前面的例子似乎满足了这个定义。我知道它没有,但我不明白为什么(我可能不太明白)。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    我猜你和我一样首先认为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]中。

    【讨论】:

    • 我明白了,这就像写instance Convert a b,然后。我的错误是我将instance Convert a b => Convert [a] [b] 视为转换[a] [f a]` 与f a,例如Convert a (f a)f ~ Convert-1。错误是 f 不存在,这很奇怪。
    猜你喜欢
    • 2015-07-13
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多