私は最近、多くの OCaml 標準ライブラリ関数を末尾再帰に書き直しています。これが単純な CPS 変換を必要としたことを考えると、なぜデフォルト バージョンがこのように書かれていないのか、私は困惑しています。
例として、標準ライブラリでは、 map は次のように定義されています。
let rec map f = function
[] -> []
| a::l -> let r = f a in r :: map f l
私はそれを次のように書き直しました:
let map f l =
let rec aux l k = match l with
[] -> k []
| a::l -> aux l (fun rest -> k (f a :: rest))
in aux l (fun x -> x)