【发布时间】:2012-08-17 20:12:32
【问题描述】:
我最近一直在将许多 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)
【问题讨论】:
-
Isint CPS 版本的功能是否比尾递归版本更高效?
-
@Gab CPS 版本的递归函数必然是尾递归的。
-
map函数是tail recursion modulo cons的一个例子。
标签: ocaml tail-recursion continuation-passing