我正在尝试创建一个删除列表前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,也不使用额外的库
对于编译器,您的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中的语法结构很少,因此很容易预测编译器将如何解析一个短语.