我是一个尝试学习Idris的新手,并且想创建一个函数test
,该函数返回一个Vector,其Vector由function参数参数化。
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
为什么会出现此错误?
答案 0 :(得分:3)
test : (k:Nat) -> Nat -> Vect k Int
带有两个参数,但您仅在k
上匹配。这就是为什么期望的类型是lambda(Nat -> Vect 0 Int
)的原因。只需放一个Nat
:test : (k : Nat) -> Vect k Int
。
此外,toIntegerNat
返回Integer
而不是Int
。 :search Nat -> Int
返回toIntNat
,因此您要在其中使用。