删除列表中的前n个项目

lal*_*lli 4 ocaml

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

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

这给了:

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
Run Code Online (Sandbox Code Playgroud)

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

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

Pas*_*uoq 8

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

((drop n)-1 (match h with a::b -> b))
Run Code Online (Sandbox Code Playgroud)

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

你的意思是:

(drop (n-1) (match h with a::b -> b))
Run Code Online (Sandbox Code Playgroud)

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


sep*_*p2k 6

drop n-1被解析为(drop n) - 1,你想要的drop (n-1).