如何比较类型是否相等?

How to Compare Types for Equality?

我试图比较 StringString,期望 True

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

然后我在比较 StringBool 时预计 False

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

我错过了 import 吗?

你不能,因为它会破坏我们在 Idris 中拥有的 parametricity。我们不能对类型进行模式匹配。但这对于编写 Eq 实现是必要的,例如:

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

此外,如果可以对类型进行模式匹配,那么在 运行 时代将需要它们。现在类型在编译时被删除。

只是在上面添加一些简单的例子:类型不能进行模式匹配,但是有一个用于命题相等的双参数类型构造函数,在 Theorem Proving 的文档部分中进行了描述。请注意,唯一的构造函数 Refl 仅生成 (=) x x 类型的值,其中两个类型参数相同。 (这是 Agda 中的

所以这将进行类型检查:

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