- 固定小数点コンビネータは、再帰を導入するための非常に便利なツールです。
- Continuation-Passing スタイルは、関数が決して返らないラムダ計算のスタイルです。代わりに、プログラムの残りの部分をラムダ引数として関数に渡し、それらを続行します。これにより、実行フローをより適切に制御し、さまざまなフロー変更構造 (ループ、コルーチンなど) をより簡単に定義できます。
しかし、ひとつひとつを表現できるかどうかは疑問です。私が見たすべての CPS スタイルの言語には、FIX
再帰を定義するための明示的な構造があります。
- なしでは、プレーンな CPS で固定小数点コンビネータ (または類似のもの) を定義できないため
FIX
ですか? もしそうなら、あなたはそのようなことの証拠を知っていますか? - それともタイピングの問題だけですか?
- それとも可能かもしれませんが、何らかの理由で非現実的ですか?
- それとも、そこにある解決策が見つからなかっただけですか...?
Y コンビネータのような CPS 関数が次のように機能することを期待しCPSY
ます。Y 対応の CPS 関数を定義すると、次のようになります。
function Yready(this, return) =
return (lambda <args> . <body using 'this' as recursion>);
次に、それを入れて、CPSY
それ自体に再帰する関数を生成します。
function CPSY(F, return) = ?????
CPSY(Yready,
lambda rec . <body where 'rec' names 'lambda <args>' from above, but with the loop closed>
)
はCPSY
、再帰に依存しない単純な継続渡しスタイルの関数である必要があります。Y コンビネータは、組み込みの再帰を使用せずに、単純なラムダ計算でこのような方法で定義できます。なんらかの形で CPS にも存在できますか?
明確にするために繰り返します:私はコンビネータのような関数CPSY
を探しています:
- CPS 関数の再帰を有効にします
- it の定義は再帰に依存しません
- it の定義は、継続渡しスタイルで与えられます (の本体内のどこにもラムダを返しません
CPSY
) 。