2015-10-19 33 views
0

我有一個任務來創建map_reverse函數。Ocaml反向和地圖

let rec map_rev func = function 
     [] -> [] 
    | h::t -> map_rev func t @ func h;; 

let f x = x * 7;; 

open Printf 
let a = map_rev f [1;2;10;20;400] 
let() = List.iter (printf "%d ") a 

現在,編譯器將不允許該行:

let a = map_rev f [1;2;10;20;400] 

因爲:

'This expression has type 'a * 'b but an expression was expected of type 'c -> 'd list'. 

誰能指出我的錯誤?爲什麼期望'c - >'d列表?

回答

3

地圖反轉函數的類型應該是('a -> 'b) -> 'a list -> 'b list。您的map_rev函數的類型爲('a -> 'b list) -> 'a list -> 'b list。所以關鍵是要弄清爲什麼編譯器認爲func返回一個列表。

+0

+1不只是給出答案。自從Mooc問世以來,我預計會有很多OCaml問題......人們可能會來這裏,通過讓他們的問題得到所有答案來破壞他人的教育體驗。 –

+2

謝謝。顯然,我同意,僅僅爲學習語言的人提供工作代碼並不是特別有用。提示和後續問題更有用。 –

1
let rec map_rev func = function 
     [] -> [] 
    | h::t -> map_rev func t @ [func h ];;