最近我一直在重写许多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)
map
函数是尾递归模cons的一个例子。 - sdcvvc