問題タブ [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.
functional-programming - ラケットのシフト/リセットを理解する
foldr
ラケットでの 2 つの素朴な実装を提示します。
この最初のものは適切な末尾呼び出しがなく、大きな値の場合に問題がありますxs
この 2 番目のものは、継続を伴う補助関数を使用して適切なテール コールを実現し、大きな値で安全に使用できるようにします。xs
見てみるracket/control
とラケットは一流の継続に対応していることが分かります。andをfoldr
使用して 2 番目の実装を表現することが可能/有益であるかどうか疑問に思っていました。しばらくいじっていたら、脳が裏返しになってしまいました。shift
reset
答えがあれば十分な説明を提供してください。私はここで大局的な理解を求めています。
haskell - MaybeとEither以外に興味深いシングルショットモナドはありますか?
Monteプログラミング言語とその祖先のEには、「エジェクター」と呼ばれるシングルショットで区切られた継続の構文があります。これは、構文境界内で一度だけ使用できる継続です。たとえば、呼び出されないイジェクターは次のとおりです。
そして、次の名前のイジェクター:
どちらも に評価され42
ます。イジェクターが呼び出されるケースにアクションを追加することもできます。
それがこの構文のすべてです。これがどのようにMaybe
またはを模倣するかを想像するのは難しくありませんEither
。Haskell Wiki on Maybeの例を慣用的なモンテに書き写します。
( を渡す負担をどのように負担しなければならないかに注意してくださいej
。Monte には、do 表記の「プログラム可能なセミコロン」がありません。)
しませんがEither
、ほとんど同じです。句を追加する機能catch
により、必要なタイプの識別が提供されます。区切られた継続は構成することがよく知られているため、複雑なツールを構築することが可能です:
これらの種類のガジェットは、Monte で手書きのパーサー コンビネーターなどを構築するために使用されます。したがって、すべてのモナドの母で、ダン・ピポニはCont
、ある意味で、Monad
他の多くのモナドをMonad
構築できる非常に原始的なものであると説明しています。モンテでもこれを試みることができます。オブジェクトベースの言語でモナドをエンコードするために Moggi のスタイルを使用しましょう。
そして、バインディング ヘルパーi
をエンコードして、それがどのように見えるかを理解しましょう。
...これは役に立ちません。これは良い構文のようには見えません。
未来にはクールなロボットが登場するはずだったが、これはそうではなかった。ただし、別の問題があります。Monad
別の伝統的な, をエンコードしましょうList
:
そして、伝統的なデカルト積をやってみましょう。まず、直接計算してみましょう。継続を渡す代わりに、リストモナドを使って直接バインドします:
そして今、エジェクタを使用して:
そう!それはかなり興味深いです。完全なリストモナド計算が実行されていますが、イジェクタはリストの最初の項目しか認識しません。エジェクターは構成可能であるため、多くの中間結果を計算しないというより良い仕事をする、より洗練された論理モナドを構築する方法があると思います。
私の質問は次のとおりです。慣用的なモンテに変換するMaybe
とEither
、エジェクタ構文がエレガントに適用されることがはっきりとわかります。このような興味深い単発動作を持つモナドが他にあるでしょうか? Haskell に限定されていると感じないでください。Monte は型付けされていないので、型付けが難しいモナドを理由にあなたを敬遠する人はいません!
kotlin - Kotlin での継続はまだ使用可能ですか? 利用可能な例はありますか?
Kotlin には continuations 用のパッケージがありますが、実験的とマークされています。API 以外のドキュメントはなく、チュートリアルや例もどこにもありません。すでに使用可能かどうか知っている人はいますか?その使用例は何ですか?