Почему в стандартной библиотеке OCaml так много не-хвостовых -рекурсивных функций?

В последнее время я переписываю многие функции стандартной библиотеки 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)
12
задан hammar 1 June 2013 в 02:57
поделиться