継続渡し(Continuation-passing style)の末尾再帰

ここらに書いてるのはこういうことだろうという。以下はリストの中の最大値を求めるコード。

let maximum xs = 
    let rec maximum proc xs = 
        match xs with
        | [] -> failwith "List is empty!!!"
        | x::[] -> proc x
        | x::xs -> maximum (fun y -> proc(max x y)) xs
    maximum id xs

実際に動かすと

> [1;5;2;3;5;6;8;1;2;3] |> maximum

val it : int = 8