以前的解決方案可以編譯,但不會給出預期的結果。函數f
從不應用於參數。正確的代碼是:
let rec list_map f ?(accum = []) l = match l with
| head :: tail -> list_map f ~accum:(f head :: accum) tail
| [] -> accum;;
推斷出的類型是:
val list_map : ('a -> 'b) -> ?accum:'b list -> 'a list -> 'b list = <fun>
...對比的錯誤之一:
val list_map : 'a -> ?accum:'b list -> 'b list -> 'b list = <fun>
請注意,這個結果清單逆轉:
# list_map ((**) 2.) [1.;2.;3.;4.];;
- : float list = [16.; 8.; 4.; 2.]
...和等於函數rev_list from the List module:
# List.rev_map ((**) 2.) [1.;2.;3.;4.];;
- : float list = [16.; 8.; 4.; 2.]
所以,你可能想改變你的函數爲:
let rec list_map f ?(accum = []) l = match l with
| head :: tail -> list_map f ~accum:(f head :: accum) tail
| [] -> List.rev accum;;
...這應該是尾遞歸以及(根據手冊)並以原始順序返回列表:
# list_map ((**) 2.) [1.;2.;3.;4.];;
- : float list = [2.; 4.; 8.; 16.]
你應該看看ocaml郵件列表上關於尾遞歸地圖的最新帖子。 http://groups.google.com/group/fa.caml/browse_thread/thread/8b2a70a767e6a433 – nlucaroni 2009-11-03 14:32:14