問題タブ [continuation-passing]

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.

0 投票する
1 に答える
639 参照

scala - Scala の継続: 連続する多くのシフト

私は、scala の継続に関する複雑な型付けの問題に頭を悩ませようとしてきました。継続パッケージの参照ドキュメントを含め、私が見つけることができるすべての資料を読んでいます。私はそれをある程度理解していると思います。

それについての私の理解(および私の質問の一部)は、このプログラムによって最もよく要約できると思います。

ちなみに、StackOverflow が scala をハイライトしないのは犯罪です!(私は訂正しました。実際にはかなり良い仕事をしますが、ライブプレビューではそうではありません)

私の質問は次のとおりです。

  1. 上記のプログラムのコメントから判断すると、scala の CPS についての私の理解に欠けているものは何ですか? Unitのように望んBでいない状況はあります@cpsParam[B,C]か?
  2. 上記のプログラムはコンパイルされ、機能します (出力され"5.0"ます)。しかし、私が混乱を引き起こしている現在直面している問題は、ブロックを変更してafterresetを呼び出そうとするときです。method2method1

(明らかに、リストの直後にコード ブロックを配置することはできません)

これを行うと (これは非常に単純なことのように思えます)、リセット時に次のコンパイラ エラーが発生します (これは scala 2.10 Milestone 2 です)。

これは、「最初のシフトは Float を返し、2 番目のシフトは String を返しますが、それはできない」という意味だと解釈します。これは正確ですか?同じ戻り値の型でない限り、CPS を使用して 2 つ (またはそれ以上) のことを連続して実行できないということですか? それは一種の深刻な制限のように思えるからです。私は、1) これを可能にする何かが欠けているか、B) CPS でそれが不可能である明白な理由が欠けている、のいずれかだと思います。しかし、それはどれですか?

scala の CPS を理解するために、ポスドクの学生である必要はないと感じ始めています。しかし、私は確かにまだそこにいません。

0 投票する
1 に答える
680 参照

javascript - memoize 継続渡しスタイル関数

cps スタイルの関数も処理できる一般的な「メモ化」関数 (関数を入力として、関数を出力として、Python のデコレータとして) を実装する方法があるかどうか疑問に思っています。

通常の関数の場合 (「結果の値はリターンによって返されます。パラメーターは入力専用です!」のように) memoize 関数は (javascript で) のように単純にすることができます。

しかし、cps スタイルの関数は単純な関数ではメモ化できません。memoize関数型の引数を「再度」評価する必要があり、それらに渡すパラメーターも知っているからです。

たとえば、次の関数が与えられた場合

多分私はそれが関数であることを見つけることnextができますが、その署名(まあ...多分、しかしそれはトリッキーです)であり、間違いなく関数で使用されるパラメーターではありません!

誰かが私が間違っていると言うことができますか? :D

半ダースの cps スタイルの関数をメモできることに興味があり、それらのすべてに「キャッシュ」を挿入するロジックを台無しにしたくありません。

0 投票する
2 に答える
1061 参照

javascript - 継続渡しスタイルはパイプと何か違うのですか?

私は継続渡しスタイル、特に関数が別の関数を最終引数として受け取り、その関数への非同期呼び出しを作成し、戻り値をこの 2 番目の関数に渡す、javascript で実装された非同期バージョンについて学習してきました。

ただし、継続渡しがパイプ (UNIX コマンドライン パイプのように) またはストリームを再作成する以上のことを行う方法がよくわかりません。

配管がはるかにきれいであることを除いて。パイプを使用すると、データが渡され、同時に実行が受信プログラムに渡されることは明らかです。実際、パイピングでは、データのストリームがパイプを通過し続けることができると期待していますが、CPS ではシリアルプロセスを期待しています。

完全なハンドオーバーとリターンではなく、通信オブジェクトと更新メソッドがデータとともに渡された場合、CPS が継続的なパイピングに拡張される可能性があることは、おそらく想像できるでしょう。

何か不足していますか?CPS は何か重要な点で違う (優れている?) ことはありますか?

明確にするために、単純なコールバックだけでなく、ある関数が別の関数に実行を渡す継続渡しを意味します。CPS は、関数の戻り値を別の関数に渡してから終了することを暗示しているようです。

0 投票する
4 に答える
1196 参照

recursion - リトルスキームの偶数のみ*&co

evens-only*&co145ページのTheLittleSchemerの例で何が起こっているのか理解するのに苦労しています。

コードは次のとおりです。

イニシャルcolは次のとおりです。

私が得ていないのは、lasで、それはasとasで'((1) 2 3)すぐに決勝に進むということです。良いですが、、、から、、、を整理しようとすると、私の心は空白になります。また、ステッパーを実行するためのDrRacket、Chez Scheme、またはMIT-Schemeのセットアップ方法について誰かが私に指導してくれると助かります。else(car l)(1)(cdr l)(2 3)dnewldproductdsumnewlproductsum

しかし、多分私は早すぎます。これを初めて読む初心者は、実際にこの野生の継続を理解することになっていますか?

0 投票する
1 に答える
254 参照

scheme - 私のCPSは正しいですか?

「The Scheme Programming Language 4th Edition」に、以下のような例があります。

(製品 '(1 2 3 4 5)) => 120

(製品 '(7 3 8 0 1 9 5)) => 0

その後、以下のように 3.3 で CPS に変換されます。

(製品 '(1 2 3 4 5) (ラムダ (x) x)) => 120

(製品 '(7 3 8 0 1 9 5) (ラムダ (x) x)) => 0

自分でやりたい、対応するCPSは以下

(製品 '(1 2 3 4 5) 1 (ラムダ (x) x)) => 120

(製品 '(1 2 0 4 5) 1 (ラムダ (x) x)) => 0

私のCPSは正しいですか?T よろしくお願いします!

よろしくお願いします

0 投票する
2 に答える
226 参照

haskell - 継続をdo表記でキャプチャする方法はありますか?

次のdoブロックなので:

次の形式に脱糖されます:

ここに継続は\x -> ...ありませんか?y -> ...

の定義で継続をキャプチャする方法があるかどうか疑問に思いましたがbind、タイプを正しく取得できません。すなわち:

今、私はタイプをいじってみました:

しかし、これも機能しません。これらの暗黙の継続をキャプチャする方法はありませんか?

ところで、私はモナドについて知っていますCont、私はただ実験して物事を試しています。

0 投票する
1 に答える
583 参照

list - リストをタプルに変換する

コマンドライン オプションがほとんどなく (たとえば 5 つ)、それらをタプルに変換したいと考えています。問題は、それらが正しい順序で表示されることを期待しているため、パターンマッチを使用してリストからタプルを簡単に構築できることですが、実際にはオプションをランダムな順序で提供できるため、リストの先頭に含まれているかどうかはわかりません詳細オプションまたはログ ファイル名?

継続渡しスタイルを使用してそれを行う方法を考えようとしましたが、何も役に立ちません。

それは可能ですか?

リストを予測順に並べ替えることができると思いますが、見栄えがよくありません。

また、タプルを削除してデータ レコードを作成することもできますが、それでも属性のタイプを確認し、レコードの正しいフィールドを設定することになります。相変わらずタイピングが多い。

0 投票する
2 に答える
1434 参照

ocaml - OCaml std lib に非末尾再帰関数がたくさんあるのはなぜですか?

私は最近、多くの OCaml 標準ライブラリ関数を末尾再帰に書き直しています。これが単純な CPS 変換を必要としたことを考えると、なぜデフォルト バージョンがこのように書かれていないのか、私は困惑しています。

例として、標準ライブラリでは、 map は次のように定義されています。

私はそれを次のように書き直しました:

0 投票する
2 に答える
555 参照

javascript - JavaScript: ダイレクト コードと CPS スタイルの生成コードのパフォーマンス比較

私のアプリケーションでは、CPS スタイルに従っている JavaScript コードを生成しています。私はそのような「継続」を「使用していません」。非同期動作なし、一時停止と再開なし、コールバックなし。

コードが継続渡しスタイルのプログラミングに従っているだけです。

機能には多くの段階があり、各段階で処理が行われ、結果が継続に渡されます。

私が見つけたのは、CPS スタイルのコードのパフォーマンスが非常に悪いということです。ダイレクト スタイルで記述されたコードは、CPS スタイルのコードよりもほぼ 150 倍高速です。

以下のコードを確認してください。
以下のコードは両方とも同等です

ダイレクト スタイル コード:

上記のコードは、ほぼ 95 ミリ秒で実行されます。

CPS スタイルのコード:

上記の CPS スタイルのコードは 15000 ミリ秒で実行されます

CPS スタイルのコードを改善するためにできることはありますか? または、JavaScript は本質的に CPS スタイルのコードには適していませんか?

上記のテストは、node.js バージョン 0.6.12 で行われます。

誰かがこの問題に光を当てることができますか?

ありがとう、

0 投票する
1 に答える
1106 参照

haskell - 型の継続渡しスタイル表現