Idris - 平等断言失败
Idris - equality assertion fails
请考虑以下功能,即使实现不是那么相关:
vectTranspose : Vect n (Fin 3) -> Vect 3 (List (Fin n))
vectTranspose {n = Z} [] = [[],[],[]]
vectTranspose {n = (S len)} (x :: xs) with (natToFin len (S len))
| Just l = let
previous = map (map weaken) (vectTranspose xs)
in updateAt x (l ::) previous
如果我尝试在 REPL 中计算 vectTranspose
,我会得到预期的 [[],[],[]]
。
不过,如果我在我的代码中添加如下等式断言
emptyTest : vectTranspose [] = [[],[],[]]
emptyTest = Refl
然后我得到一个编译错误:
When checking right hand side of emptyTest with expected type
vectTranspose [] = [[], [], []]
Type mismatch between
[[], [], []] = [[], [], []] (Type of Refl)
and
vectTranspose [] = [[], [], []] (Expected type)
Specifically:
Type mismatch between
[[], [], []]
and
vectTranspose []
我错过了什么吗?我应该以某种方式在断言中指定 [[],[],[]]
的类型吗?
idris 抱怨
类型的事实
Specifically:
Type mismatch between
[[], [], []]
and
vectTranspose []
表示vectTranspose
还在类型中,没有解析。如果 vectTranspose 不是总的并且确实不是:
VecTest.vectTranspose is possibly not total due to:
with block in VecTest.vectTranspose, which is not total as there are missing cases
发生这种情况是因为您没有涵盖所有 Maybe
个案例。
一个简单的解决方案可能是创建一个小的辅助函数:
total
natToFin': (n: Nat) -> Fin (S n)
natToFin' Z = FZ
natToFin' (S k) = FS (natToFin' k)
total
vectTranspose : Vect n (Fin 3) -> Vect 3 (List (Fin n))
vectTranspose {n = Z} [] = [[], [], []]
vectTranspose {n = (S len)} (x :: xs) with (natToFin' len)
vectTranspose {n = (S len)} (x :: xs) | l = let
previous = map (map weaken) (vectTranspose xs)
in updateAt x (l ::) previous
请考虑以下功能,即使实现不是那么相关:
vectTranspose : Vect n (Fin 3) -> Vect 3 (List (Fin n))
vectTranspose {n = Z} [] = [[],[],[]]
vectTranspose {n = (S len)} (x :: xs) with (natToFin len (S len))
| Just l = let
previous = map (map weaken) (vectTranspose xs)
in updateAt x (l ::) previous
如果我尝试在 REPL 中计算 vectTranspose
,我会得到预期的 [[],[],[]]
。
不过,如果我在我的代码中添加如下等式断言
emptyTest : vectTranspose [] = [[],[],[]]
emptyTest = Refl
然后我得到一个编译错误:
When checking right hand side of emptyTest with expected type
vectTranspose [] = [[], [], []]
Type mismatch between
[[], [], []] = [[], [], []] (Type of Refl)
and
vectTranspose [] = [[], [], []] (Expected type)
Specifically:
Type mismatch between
[[], [], []]
and
vectTranspose []
我错过了什么吗?我应该以某种方式在断言中指定 [[],[],[]]
的类型吗?
idris 抱怨
类型的事实Specifically:
Type mismatch between
[[], [], []]
and
vectTranspose []
表示vectTranspose
还在类型中,没有解析。如果 vectTranspose 不是总的并且确实不是:
VecTest.vectTranspose is possibly not total due to:
with block in VecTest.vectTranspose, which is not total as there are missing cases
发生这种情况是因为您没有涵盖所有 Maybe
个案例。
一个简单的解决方案可能是创建一个小的辅助函数:
total
natToFin': (n: Nat) -> Fin (S n)
natToFin' Z = FZ
natToFin' (S k) = FS (natToFin' k)
total
vectTranspose : Vect n (Fin 3) -> Vect 3 (List (Fin n))
vectTranspose {n = Z} [] = [[], [], []]
vectTranspose {n = (S len)} (x :: xs) with (natToFin' len)
vectTranspose {n = (S len)} (x :: xs) | l = let
previous = map (map weaken) (vectTranspose xs)
in updateAt x (l ::) previous