フィボナッチのような単純な問題の場合、CPSの記述は比較的簡単です
let fibonacciCPS n =
let rec fibonacci_cont a cont =
if a <= 2 then cont 1
else
fibonacci_cont (a - 2) (fun x ->
fibonacci_cont (a - 1) (fun y ->
cont(x + y)))
fibonacci_cont n (fun x -> x)
ただし、ここからのロッドカットの例 (またはアルゴのイントロの本)の場合、クロージャの数は常に2に等しいとは限らず、ハードコーディングすることはできません。
中間変数をシーケンスに変更する必要があると思います。
(継続は、「価値があるときは、それを私に渡して、治療後に上司に渡す」という契約、または実際の実行を延期するものと考えるのが好きです)
ロッドカットについては、
//rod cutting
let p = [|1;5;8;9;10;17;17;20;24;30|]
let rec r n = seq { yield p.[n-1]; for i in 1..(n-1) -> (p.[i-1] + r (n-i)) } |> Seq.max
[1 .. 10] |> List.map (fun i -> i, r i)
この場合、新しく作成した続きを添付する必要があります
let cont' = fun (results: _ array) -> cont(seq { yield p.[n-1]; for i in 1..(n-1) -> (p.[i-1] + ks.[n-i]) } |> Seq.max)
返されるサブ問題によって作成された「デカルト積」の継続に。ロッドカッティングのCPSバージョンを見た人はいますか/これに関するヒントはありますか?