为什么 Idris 会给我以下代码的类型不匹配错误?

Why does Idris give me Type mismatch error for the following code?

我是一名尝试学习 Idris 的新手,我想创建一个函数 test,returns 一个 Vector,其类型由函数参数参数化。

vecreplicate : (len : Nat) -> (x : elem) -> Vect len elem
vecreplicate Z     x = []
vecreplicate (S k) x = x :: vecreplicate k x

test : (k:Nat) -> Nat -> Vect k Int
test Z = vecreplicate Z (toIntegerNat Z)
test k = vecreplicate k (toIntegerNat k)

当我尝试使用 Idris 编译代码时,出现以下类型错误

Type mismatch between
    Vect len elem (Type of vecreplicate len x)
and
    Nat -> Vect 0 Int (Expected type)

Specifically:
    Type mismatch between
            Vect len
    and
            \uv => Nat -> uv

为什么会出现此错误?

test : (k:Nat) -> Nat -> Vect k Int 有两个参数,但你只匹配 k。这就是预期类型是 lambda (Nat -> Vect 0 Int) 的原因。就丢一个 Nat: test : (k : Nat) -> Vect k Int.

另外,toIntegerNat returns Integer 而不是 Int:search Nat -> Int returns toIntNat,这就是你想在那里使用的。