В последнее время я переписывал многие функции стандартной библиотеки OCaml, чтобы они были хвостовыми рекурсивными. Учитывая, что это повлекло за собой прямое преобразование CPS, я не понимаю, почему версии по умолчанию не написаны таким образом.
Например, в стандартной библиотеке карта определена как:
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. - person sdcvvc   schedule 19.08.2012