問題タブ [delimited-continuations]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - Scala CPS フレームワークでの一貫性のない動作
各データ依存関数を並行してステップ実行することにより、バッチ データ フェッチを有効にするコルーチン フレームワークを構築しようとしています。これが私がこれまでに持っているものです:http://pastie.org/7147798
これはうまくいきません
次のエラーが表示されます
これは機能します
/li>これはうまくいきません
次のエラーが表示されます
これは機能します
しかし、次の警告が表示されます
/li>
scala - while ループで Scala の継続を使用する
これは SO の質問の通常の意味に反していることは認識していますが、次のコードは機能しないはずですが、機能します。以下は、while ループで継続を使用する小さな Scala プログラムです。継続渡しスタイルに関する私の理解によれば、このコードは、while ループの反復ごとにスタックにフレームを追加することにより、スタック オーバーフロー エラーを生成するはずです。ただし、問題なく動作します。
出力は次のとおりです。
私の質問は: スタック オーバーフローがないのはなぜですか? Scala コンパイラーは末尾呼び出しの最適化を行っているのでしょうか (継続ではできないと思いました)、それとも何か他のことが起こっているのでしょうか?
(この実験は、それを実行するために必要な sbt 構成と共に github にあります: https://github.com/jcrudy/scala-continuation-experiments。コミット 7cec9befcf58820b925bb222bc25f2a48cbec4a6 を参照)
asynchronous - async/await パターンと継続の関係は?
async
/await
パターン (Scala、F#、C# などで知られている) と継続との関係はどうなっているのだろうと思っています。
async
/パターンはawait
本格的な継続の限られたサブセットですか? (もし本当なら、継続はどのようにより表現力豊かになりますか?)- 継続は
async
/の実装手法の 1 つにすぎawait
ませんか? (もしそうなら、他にどのような実装アプローチが存在しますか?) - それとも、
async
/await
および継続は、制御フロー/データフローの抽象化を可能にするという唯一の共通点がある、単なる直交概念ですか?
scheme - 「継続プロンプト」とは正確には何ですか?
ドキュメントを解読しようとしています
call-with-continuation-prompt
指定されたに適用
proc
されarg
、現在の継続がプロンプトによって拡張されます。プロンプトは によってタグ付けされます。これは、 (デフォルト) または のprompt-tag
いずれかからの結果である必要があります。の結果は呼び出しの結果です。default-continuation-prompt-tag
make-continuation-prompt-tag
proc
call-with-continuation-prompt
「現在の継続でproc
指定されたsに適用される」という部分は理解していますが、そこからは意味不明です。arg
継続が「拡張」されるとはどういう意味ですか? また、「プロンプト」はどのようにしてこの「拡張」を行うのでしょうか?
scheme - スキームでyieldとsendを実装する
PythonからSchemeに移植しようとしてyield
います。yield from
これが私が行った実装です:
この実装の問題は、それを呼び出す方法が Python の のように見えないことですyield
。
とりわけ、コルーチンを再起動する必要があるたびに、コルーチンを有効にするために新しい変数が必要 です。基本的に、構文が冗長すぎると思います。よりクリーンな構文を持つ別のものはありますか?let
return
exit
コルーチンyield
に 値を付けることが可能である必要があります。send
コルーチンの使用方法の例を次に示します。
上記では、1
は無視され、その後100
、1000
はsend
ジェネレーターに送信されます。@sylwester コードに基づいて実装を行いましたが、マクロに問題があります。
haskell - 継続して計算を一時停止
計算を一時停止し、後で要求に応じて (ユーザーからのプロンプトで) 再開しようとしています。継続モナドのみを使用すると、次のようになります。
出力例:
質問の元のバージョン:
scala - Scala で区切られた継続を使用した二分木合計
私は Scala をいじっており、バイナリ ツリーの実装などの簡単な例から始めています。関数型プログラミング (OCaml、F#) の予備知識を持っていたので、バイナリ ツリー トラバーサルを末尾再帰にするために継続を使用する一般的なアプローチを再現しようとしていました。Scala の Delimited Continuations についてできる限り読んでいますが、機能させることができませんでした。
この StackOverflow questionから、この動作の OCaml 実装を読むことができます
このShift と Reset を使用したプログラミングの紹介の例に従いましたが、常に型エラーが発生し、それを機能させるために行った変更により正しい結果が得られましたが、関数の末尾を再帰的にすることはありませんでした。
これが私の実装です
また、区切り継続がこの仕事に適したツールであるかどうかも疑問に思っています。この問題は明示的なスタックを渡すことで効率的に解決できることはわかっていますが、Scala で cps を使用する方法を理解したいと思います。