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