我尝试比较String
和String
,期待True
。
Idris> String == String
Can't find implementation for Eq Type
然后,在将False
与String
进行比较时,我期待Bool
。
Idris> String /= Bool
Can't find implementation for Eq Type
我错过了import
吗?
答案 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