¿Por qué el OCaml std lib tiene tantas funciones no recursivas de cola?
He estado reescribiendo muchas funciones de la biblioteca estándar de OCaml para ser recursivas últimamente. Dado que esto ha implicado una transformación de CPS directa, me quedo desconcertado sobre por qué las versiones predeterminadas no se escriben de esta manera.
Como ejemplo, en la biblioteca estándar, el mapa se define como:
let rec map f = function
[] -> []
| a::l -> let r = f a in r :: map f l
Lo he reescrito para que sea:
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)