List.fold_right
不tail-recursive
這裏表示http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html爲什麼不將OCaml List.fold_right作爲尾遞歸實現?
我的問題是,爲什麼List.fold_right
沒有爲tail-recursive
執行?
我認爲這是不難做到
let rev l =
let rec revr acc = function
| [] -> acc
| hd::tl -> revr (hd::acc) tl
in
revr [] l;;
let fold_right f l b =
let rev_l = rev l
in
let rec folder_rr acc = function
| [] -> acc
| hd::tl -> folder_rr (f hd acc) tl
in
folder_rr b rev_l;;
我在圖書館還發現,許多功能都沒有tail-recursive
,而他們可以爲tail-recursive
來實現。 製造商是如何做出這樣的決定的?
你有沒有證據表明尾遞歸版本比較慢?我不相信... :-) – 2013-06-14 16:48:36
通過上面的原始帖子完成'fold_right'尾遞歸的簡單方法是首先顛倒列表,然後使用fold_left。這在基準測試中有一個很容易衡量的成本。更復雜的技術是可用的,例如在通常的遍歷中使用計數器,並且只有當計數器通過閾值時纔將剩下的列表翻轉過來。這允許小列表的開銷非常小。我們已經實現了這個[在電池](https://github.com/ocaml-batteries-team/batteries-included/blob/master/src/batList.ml#L380),表現還可以。 – gasche 2013-06-14 16:58:52