2010-10-19 76 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的這麼少的語法結構,它很快變得容易預測,編譯器將如何解析一個短語。