2017-02-18 39 views
0

我正在寫入一種形式的OCaml轉換形式,它接受函數並接受一個列表進行轉換。我明白我的模式匹配在類型檢查方面有些問題,因爲它不會編譯並聲明類型不匹配,但我不確定我的情況究竟出了什麼問題。 當我嘗試編譯時,我收到一個實際的聲明錯誤,強調函數的名稱。OCaml瞭解函數和部分應用程序

let rec convert (fun: 'b -> 'c option) (l: 'b list) : 'c list = 
begin match l with 
| [] -> [] 
| h::tl -> if f h = Some h then h :: convert f tl 
     else convert f tl 

end 

我寫了下面的測試,爲了確保功能正常工作,我寫了下面的測試。

let test() : bool = 
let f = func x -> if x > 3 then Some (x + 1) else None in 
convert f [-1; 3; 4] = [5] 
;; run_test "Add one" test 

我非常有信心這個錯誤在我的第二個模式匹配中。

回答

1
  1. 在詢問編譯錯誤(以及編譯器抱怨的位置)時,您應該在將來提供確切的錯誤消息。

  2. h :: convert f tlconvert f tl'c list,但h'b,所以你不能像這樣將它們結合起來。 f h = Some h也沒有意義:f h'c optionSome h'b option。你可能想匹配f h代替:

    | h::tl -> match f h with 
          | Some h1 -> ... 
          | None -> ... 
    
+0

1.會做,謝謝你的建議。此錯誤強調了第一行中的函數convert的名稱。 2.當你說匹配f h時,你的意思是用h :: tl替換模式匹配嗎?或者在函數的第二行中與'b列表l匹配?謝謝。 – rubyquartz

+0

1.您還應該看到錯誤消息,如下所示:https://ocaml.org/learn/tutorials/common_error_messages.html。如果您不這樣做,則需要先解決此問題,因爲錯誤消息非常有用。 2.我已經擴展了答案(不完整,因爲如果你想完成它會更好)。 –