F#のYコンビネーターの定義は
let rec y f x = f (y f) x
fは、最初の引数として、再帰的サブ問題の継続を期待しています。yfを継続として使用すると、fが次の呼び出しに適用され、開発できることがわかります。
let y f x = f (y f) x = f (f (y f)) x = f (f (f (y f))) x etc...
問題は、先験的に、このスキームがテールコールの最適化を使用できないことです。実際、fで保留中の操作がある可能性があります。その場合、fに関連付けられたローカルスタックフレームを変更できません。
そう :
- 一方では、Yコンビネータを使用するには、関数自体とは明示的に異なる継続が必要です。
- TCOを適用する必要がある場合は、fで保留中の操作はなく、f自体のみを呼び出します。
これら2つを調整する方法を知っていますか?アキュムレータトリックを使用したYや、CPSトリックを使用したYなど?それともそれができる方法がないことを証明する議論?
f
。サンクでy
テールコールf
する可能性があることがわかり(y f)
ますが、あなたが言うf
ように、保留中の操作があるかもしれません。テールコールにより適した別のコンビネーターがあるかどうかを知ることは興味深いと思います。この質問がCS Stackexchangeサイトでもっと注目されるのではないかと思いますか?