2010-10-19 74 views
4

我试图让这滴列表的前n项功能:删除前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的第一天(通常是函数式编程),我只是在互联网上阅读手册和教程。我不知道这个消息的含义。

此外,这是需要除函数定义没有用咱们的大作业的一部分,并没有使用额外的库

回答

6

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

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的这么少的语法结构,它很快变得容易预测,编译器将如何解析一个短语。