如何比较类型的平等?

时间:2016-04-11 16:07:58

标签: idris

我尝试比较StringString,期待True

Idris> String == String
Can't find implementation for Eq Type

然后,在将FalseString进行比较时,我期待Bool

Idris> String /= Bool
Can't find implementation for Eq Type

我错过了import吗?

2 个答案:

答案 0 :(得分:6)

你不能像我们在伊德里斯那样打破parametricity。我们不能在类型上进行模式匹配。但是,编写Eq实现是必要的,例如:

{- Doesn't work!
eqNat : Type -> Bool
eqNat Nat = True
eqNat _ = False -}

此外,如果可以在类型上进行模式匹配,则在运行时需要它们。现在类型在编译时会被删除。

答案 1 :(得分:0)

只需在上面添加一些简单的示例:类型就不能进行模式匹配,但是有一个用于命题相等的两个参数类型构造函数,如Theorem Proving的文档部分所述。请注意,唯一的构造函数Refl仅产生类型为(=) x x的值,其中两个类型参数都相同。 (这是阿格达的

因此,它将进行类型检查:

twoPlusTwoEqFour : 2 + 2 = 4
twoPlusTwoEqFour = Refl

这样:

stringEqString : String = String
stringEqString = Refl

但不是这样:

stringEqInt : String = Int
stringEqInt = Refl

-- type error: Type mismatch between String and Int

这需要额外的工作来证明,因为加法是通过左参数的递归来定义的,并且n + 0不能进一步减少:

proof : n = n + 0