为什么Idris给我以下代码的Type mismatch错误?

时间:2019-08-22 06:43:35

标签: idris dependent-type

我是一个尝试学习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

为什么会出现此错误?

1 个答案:

答案 0 :(得分:3)

test : (k:Nat) -> Nat -> Vect k Int带有两个参数,但您仅在k上匹配。这就是为什么期望的类型是lambda(Nat -> Vect 0 Int)的原因。只需放一个Nattest : (k : Nat) -> Vect k Int

此外,toIntegerNat返回Integer而不是Int:search Nat -> Int返回toIntNat,因此您要在其中使用。