我正在尝试创建一个删除列表前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,也不使用额外的库
答案 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)
。