为什么 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
,这就是你想在那里使用的。
我是一名尝试学习 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
,这就是你想在那里使用的。