継続はモナドと言えるのか? それらはモナドのサブセットですか、それとも単にモナドを実装する方法ですか?
編集:それとも、間違っていて、モナドは継続よりも抽象的な概念ですか? (つまり、ここではリンゴとオレンジを実際に比較しています)
継続はモナドと言えるのか? それらはモナドのサブセットですか、それとも単にモナドを実装する方法ですか?
編集:それとも、間違っていて、モナドは継続よりも抽象的な概念ですか? (つまり、ここではリンゴとオレンジを実際に比較しています)
継続モナドは単に継続モナドであるだけでなく、継続と状態があればどんな機能的モナドもシミュレートできるという意味で、一種の普遍的なモナドです。この印象的だが非常に技術的な結果は、Andrzej Filinskiの印象的で非常に技術的な精神から来ています。
ユニット操作と拡張操作が純粋に機能的な用語として表現できるモナドは、「構成可能な継続」を使用して値による呼び出し言語に埋め込むことができることを示します。
簡単に言えば、モナドの「バインド」は引数として有効な継続 (「残りの計算」のラムダ) を取るため、モナドはその意味で継続です。反対に、継続渡しスタイルは、以下のさまざまなリンクで示唆されているように、モナド構文シュガーを使用して非 CPS 言語で効果的に実装できます。
Haskell の「モナドに関するすべて」チュートリアルから:
https://www.haskell.org/haskellwiki/All_About_Monads#The_Continuation_monads
for-style-loop の 'break' と 'continue' を実装するために使用される F# 継続モナド
http://cs.hubfs.net/forums/thread/9311.aspx
F# の問題に継続モナドを適用する例:
http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!256.entry
そうである必要はありませんが、そうすることができます。あなたの質問を少し逆にして、代わりにモナドは継続を実装する方法であると言います。ただし、多くの方法で継続を実装できます。たとえば、C# であまり労力をかけずに、控えめではあるが制約のある CPS の複製を行うことができます。非常に徹底的な処理については、Haskell サイトのThe Continuation Monadを参照してください。
継続は、プログラム内の特定の機能です。モナドは型コンストラクタです。
型Cont<T>
を取る継続の型T
構築子はモナドではありません。
しかし、Cont<Cont<T>>
はモナドであり、これが一般に「継続モナド」と呼ばれるものです。
(言語に callcc があることは、 から に変換できることと同じCont<Cont<T>>
ですT
。)