問題タブ [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.

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

scheme - スキームでの継続 (call/cc)

今後の試験のためにスキームの継続を理解する必要がありますが、継続についてはまったくわかりません。誰かが継続学習の方法の情報源を教えてもらえますか?

よろしく、

ダーキー

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

scala - CPS/Continuations (末尾) 再帰関数の StackOverflowError

CPS 内で StackOverflow をスローしない末尾再帰関数を使用する方法はありますか?

次の StackOverflowError が発生します。

このエラーを回避する方法はありますか? トランポリン?例外をスローしてスタックを巻き戻す? ありがとう!

0 投票する
6 に答える
4288 参照

lua - Luaのcall/cc - 可能ですか?

ウィキペディアの継続に関する記事には次のように書かれ
ます。 それが真実であり、その方法を知る必要があるか、それとも真実ではなく、そのステートメントを修正する必要があります. これが本当なら、Lua で call/cc を実装する方法を教えてください。方法がわかりません。ここで 説明されているように、Lua に coroutine.clone 関数があれば、call/cc を手動で実装できると思います。 クロージャーが call/cc を実装するのに十分でない場合、他に何が必要ですか?







以下のテキストはオプションの読み物です。
PS: Lua には、コルーチン テーブルによるワンショット継続があります。coroutine.clone 関数を使用すると、それを複製して複数回呼び出すことができるため、実質的に call/cc が可能になります (call/cc を誤解していない限り)。しかし、そのクローン機能は Lua には存在しません。Lua IRC チャンネルの誰かが、Pluto ライブラリ (シリアライゼーションを実装) を使用してコルーチンをマーシャリングし、コピーしてからアンマーシャリングし、再度使用することを提案しました。それはおそらくうまくいくでしょうが、call/cc の理論的な実装と、言語が手動で実装できるようにするために必要な機能の実際の最小セットは何かを見つけることにもっと興味があります。

編集 1: OK 人々、ここで私を助けてください。Scheme をまったく知らないので、これには長い時間がかかりましたが、私たちを助ける何かを思いつきました。以下のコードを見てください。1 つ目は Scheme のプログラムで、2 つ目は同じプログラムですが Lua で作成したものです。
うまくいけば、これが私たちを助けるでしょう。私たちは非常に近いと信じています。

PS: これらの例は、CallCC に関するウィキペディアの記事の最初の例から取られています。 スキームのバージョン



ルア版



私は Windows 用の DrScheme と Lua を使用しています。この 2 つは、簡単にダウンロードしてインストールできるツールで、これらを支援したいと考えている人なら誰でも使用できます。

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

scheme - dynamic-wind と call/cc のヘルプ

次のSchemeプログラムの動作を理解するのに苦労しています:

私が理解しているように、 c は "(display 'X)" の直前に作成された継続にバインドされます。

しかし、c を使用すると、それ自体が変更されるようです。上記の定義により、(予想どおり) IN、X、および OUT が出力されます。

そして、それは手順です:

今、私はそれが再び呼び出されたときに X が出力されることを期待していますが、そうではありません!

そして、c はもはや手続きではなく、c の 2 回目の呼び出しは機能しません!

(c) を呼び出すたびに、IN、X、および OUT を出力するという同じことが行われると予想していました。私は何が欠けていますか?

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

haskell - Haskell CPS プログラミング スタイルの問題

これは、CPS スタイルを使用してリスト内の要素を乗算する関数です。

aux (0:xs) nk = k 0で'k' を 'nk'に変更するとどうなりますか? 2 つの違いは何ですか?

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

c# - Mono.Tasklets.Continuationを使用してクラッシュする

monoを使用してC#のマイクロスレッドメッセージパッシングライブラリで作業しようとしています。Mono 2.4かそこら以来、明らかに継続(yieldではない)が「Mono.Tasklets」の下で利用可能になっています。ただし、これらには私が見つけることができるドキュメントがなく、それらの一般的な使用法は機能しますが、デバッガーが接続しないときどき(ただし再現可能な)クラッシュが発生します。

私の具体的な質問は次のとおりです。

Mark()関数とは何か、いつどこで呼び出す必要があるかを知っている人はいますか?これは1回限りの初期化のようですが、なぜそれがコンストラクターに含まれないのかわかりません。

複数の継続を使用することに制限はありますか?継続を別のスレッドに渡すことができないことを発見しましたが、複数の継続を保存して前後に切り替えることができるようですか?

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

scala - "for" を使用した C# ライクな yield の Scala 実装

私は、次のような"for" 構文を使用して、C# のような yield return (つまり、これ) のさまざまな Scala 実装を使用しようとしています。

しかし、このコードはエラーでコンパイルされます:

私が理解しているように、 for 内のすべてのコードを() => Unitではなく の型にする必要があり() => Unit @with-annotationsます。どうやってやるの?

この問題は非常に一般的なようですが、インターネットで言及されているものは見つかりませんでした。

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

c# - シリアル化と Yield ステートメント

yieldクラスをリハイドレートしたときに、生成されたイテレータの内部状態が保持されるように、ステートメントを含むメソッド (またはそのようなメソッドを含むクラス) をシリアル化することは可能ですか?

0 投票する
5 に答える
10435 参照

haskell - Haskell Contモナドはどのようにそしてなぜ機能するのですか?

これは、Contモナドが定義される方法です。

これがどのように、そしてなぜ機能するのか説明していただけますか?何してるの?

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

scala - 暗黙のモナドにScalaの区切られた継続を使用する

私は、モナディックインターフェイスによって定義されたある種のDSLで遊んでいます。

一連のflatMapアプリケーションを使用してモナドを適用するのはちょっと面倒で、構文的にはそれほど美しくないので、区切られた継続を使用してモナドコードと非モナドコードを暗黙的に混合しようとしています。

実際には正常に機能していますが、コンパイル可能にするために「Any」タイプに自分自身を制限する必要があるため、タイプには本当に満足していません:(。したがって、後で結果が得られたときに「Any」と「casting」を使用します。必要な場合、ランタイムエラーが発生する可能性があります。

これは、ScalaのOption-Monadを通常のコードと混合するためのコードの例です。これにより、私が話していることがわかります。

次のコマンドでコードをコンパイルします:$ scalac -P:continuations:enable BO.scala

そしてscalaREPLでテストします:

Option-Monadは、runOption関数を使用して実行されます(テスト関数を参照)。runOption内で呼び出される関数は、 get関数またはvalueメソッドを使用して、 Optionから値を取得できます。値がNoneの場合、モナドはすぐに停止し、Noneを返します。したがって、 Option型の値でパターンマッチングを行う必要はありません。

問題は、runOptionで「Any」タイプを使用し、 getで継続のタイプを使用する必要があることです。

runOptionを表現してscalaでrank-n型を取得することは可能ですか?だから私は書くことができます:

ありがとう!