にバイナリ再帰を変換するために継続を使って、私は195ページの例のコードスニペットを見つけました:次のように私はプログラミングのF#の本を読んでいたよう末尾再帰
type ContinuationStep<'a> =
| Finished
| Step of 'a * (unit -> ContinuationStep<'a>)
let iter f binTree =
let rec linearize binTree cont =
match binTree with
| Empty -> cont()
| Node(x, l, r) ->
Step(x, (fun() -> linearize l (fun() -> linearize r cont)))
let steps = linearize binTree (fun() -> Finished)
let rec processSteps step =
match step with
| Finished ->()
| Step(x, getNext)
-> f x
processSteps (getNext())
processSteps steps
継続を使用することにより、トラバースのバイナリ再帰バイナリはテール再帰関数processSteps
に変換されています。私の質問は、他の関数、linearize
は非テール再帰的であるようです。これは、バイナリ再帰を末尾再帰に完全に変換することができないことを意味しますか?