删除列表中的前n个项目

时间:2010-10-19 18:37:55

标签: ocaml

我正在尝试创建一个删除列表前n项的函数:

let rec drop n h =
   if n == 0 then h else (drop n-1 (match h with a::b -> b));;

这是给予:

Characters 43-49:
   if n == 0 then h else (drop n-1 (match h with a::b -> b));;
                          ^^^^^^
Error: This expression has type 'a -> 'b but is here used with type int

这里有什么问题?这是我在OCAML的第一天(通常使用函数式编程),我只是在互联网上关注手册和教程。我不知道这个消息是什么意思。

此外,这是一个较大的作业的一部分,除了函数定义之外不需要使用Let,也不使用额外的库

2 个答案:

答案 0 :(得分:8)

对于编译器,您的else案例如下所示:

((drop n)-1 (match h with a::b -> b))

错误消息表示(drop n)是一个函数,您尝试将其用作int(从中减去一个)。

你的意思是:

(drop (n-1) (match h with a::b -> b))

首先,OCaml的关联性有点令人惊讶,但由于OCaml中的句法结构很少,因此很容易预测编译器将如何解析短语。

答案 1 :(得分:6)

drop n-1被解析为(drop n) - 1,您需要drop (n-1)