为什么在 Idris 2 中不进行 cong 类型检查
Why doesn't cong typecheck in Idris 2
我正在编写一个函数来测试 Nat
的命题相等性,它在 Idris 1 中进行类型检查。
sameNat : (n : Nat) -> (m : Nat) -> Maybe (n = m)
sameNat Z Z = Just Refl
sameNat (S n) (S m) = case sameNat n m of
Just e => Just (cong e)
Nothing => Nothing
sameNat _ _ = Nothing
但是它在 Idris 2 (0.4.0) 中没有进行类型检查,我得到了这个错误。
Error: While processing right hand side of sameNat. When
unifying n = m and Nat m e -> :: ?x ?xs n m e.
Mismatch between: n = m and Nat m e -> :: ?x ?xs n m e.
它会在我编写 cong
的特定版本并使用它时进行类型检查。
cong' : n = m -> S n = S m
cong' Refl = Refl
为什么不进行类型检查,我该如何进行类型检查?
cong
的类型签名已更改:
伊德里斯 1:
cong : (a = b) -> f a = f b
伊德里斯 2:
Prelude.cong : (0 f : (t -> u)) -> a = b -> f a = f b
我正在编写一个函数来测试 Nat
的命题相等性,它在 Idris 1 中进行类型检查。
sameNat : (n : Nat) -> (m : Nat) -> Maybe (n = m)
sameNat Z Z = Just Refl
sameNat (S n) (S m) = case sameNat n m of
Just e => Just (cong e)
Nothing => Nothing
sameNat _ _ = Nothing
但是它在 Idris 2 (0.4.0) 中没有进行类型检查,我得到了这个错误。
Error: While processing right hand side of sameNat. When
unifying n = m and Nat m e -> :: ?x ?xs n m e.
Mismatch between: n = m and Nat m e -> :: ?x ?xs n m e.
它会在我编写 cong
的特定版本并使用它时进行类型检查。
cong' : n = m -> S n = S m
cong' Refl = Refl
为什么不进行类型检查,我该如何进行类型检查?
cong
的类型签名已更改:
伊德里斯 1:
cong : (a = b) -> f a = f b
伊德里斯 2:
Prelude.cong : (0 f : (t -> u)) -> a = b -> f a = f b