如何比较类型是否相等?
How to Compare Types for Equality?
我试图比较 String
和 String
,期望 True
。
Idris> String == String
Can't find implementation for Eq Type
然后我在比较 String
和 Bool
时预计 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
我试图比较 String
和 String
,期望 True
。
Idris> String == String
Can't find implementation for Eq Type
然后我在比较 String
和 Bool
时预计 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