我最近一直在重写许多 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)