問題タブ [free-monad]
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.
haskell - 一時停止モナド
モナドは多くの驚くべき、クレイジーなことをすることができます。それらは、値の重ね合わせを保持する変数を作成できます。それらはあなたがそれを計算する前にあなたが未来からのデータにアクセスすることを可能にすることができます。彼らはあなたが破壊的な更新を書くことを可能にすることができますが、実際にはそうではありません。そして、継続モナドはあなたが人々の心を壊すことを可能にします!通常はあなた自身のものです。;-)
しかし、ここに課題があります。一時停止できるモナドを作成できますか?
Pause
モナドは一種の状態モナドです(したがって、mutate
明白なセマンティクスを備えています)。通常、このようなモナドには、計算を実行して最終状態を返す、ある種の「実行」関数があります。ただしPause
、違います。step
魔法の関数を呼び出すまで計算を実行する関数を提供しyield
ます。ここで計算は一時停止され、後で計算を再開するのに十分な情報が呼び出し元に返されます。
さらに素晴らしい場合:呼び出し元が呼び出し間の状態を変更できるようにしstep
ます。(たとえば、上記の型署名はこれを可能にするはずです。)
ユースケース:複雑なことを行うコードを書くのは簡単なことがよくありますが、それを変換して操作の中間状態も出力するための完全なPITAです。ユーザーが実行の途中で何かを変更できるようにしたい場合、物事は非常に速く複雑になります。
実装のアイデア:
明らかに、それはスレッド、ロック、およびで行うことができます
IO
。しかし、もっとうまくやれるでしょうか?;-)継続モナドで何かおかしなことはありますか?
たぶん、ある種のライターモナドで、現在の状態をログに記録するだけで、ログ内の状態を反復処理することで、その
yield
ふりをすることができます。step
(明らかに、これにより、ステップ間で状態を変更することはできなくなります。これは、現在、実際には何も「一時停止」していないためです。)
haskell - `Free`にMonadFixを実装することは可能ですか?
http://hackage.haskell.org/package/free inをControl.Monad.Free.Free
使用すると、任意のの「無料モナド」にアクセスできますFunctor
。ただし、MonadFix
インスタンスはありません。これは、そのようなインスタンスを記述できないためですか、それとも単に省略されたためですか?
そのようなインスタンスを書き込めないのなら、どうしてですか?
haskell - あるファンクター上の Free として表現できるモナドは?
のドキュメントにFree
は次のように書かれています:
多くの一般的なモナドが自由モナドとして発生し、
- 与えられ
data Empty a
たは、モナドFree Empty
に同型です。Identity
- Free
Maybe
を使用して、各層が計算をしばらく実行することを表す部分モナドをモデル化できます。
を使用して表現できる他のモナドは何Free
ですか?
もう 1 つしか考えられませんでしFree (Const e)
たEither e
。
編集:使用して表現できないモナドFree
とその理由は?
haskell - モナドの無料モナド
とx >>= f
同等retract (liftF x >>= liftF . f)
ですか?
つまり、モナドでもあるファンクターからの無料のモナドビルドのモナドインスタンスは、元のモナドと同等のモナドインスタンスを持つことになりますか?
haskell - これらのフリーのような構造の一般化はありますか?
私は自由なアイデアで遊んでいて、これを見つけました:
関数を書くことができる条件を見つけたい:
しかし、この関数を書くことを可能にする意味のある構造を見つけることができませんでした( のメソッドでf
ある簡単なものを除く)。特に私の美的センスは、この構造がタイプに言及していないことを好みます。mkFree
???
Free
誰かが前にこのようなものを見たことがありますか? この一般化は可能ですか?私がまだ考えていない方向への既知の一般化はありますか?
haskell - free モナドを使って Reader を実装するにはどうすればよいですか?
わかりましたので、パッケージを使用して実装する方法を理解しましたReader
(および、表示されていません):ReaderT
operational
しかし、これを無料のモナドで行う方法を一生理解できません (私は Edward Kmett のfree
パッケージを使用しています)。私が得た最も近いものはこれです。これは不正行為であると理解しています((->) r)
(すでにモナドである方法についての何か):
これが私が思っているほど愚かではなかったとしても、基本的に私が欲しいのはReader
データとして検査できるようにすることなので、それは私が望むものではありません...
haskell - フリーモナドへのセマンティクスの適用
私は、特定のセマンティクスをファンクター上のフリー モナドに適用するパターンを抽象化しようとしています。これを動機付けるために私が使用している実行中の例は、ゲーム内のエンティティに更新を適用することです。そこで、いくつかのライブラリをインポートし、この例の目的のためにいくつかの型とエンティティ クラスを定義します (私は control-monad-free で free モナド実装を使用しています):
ここで、いくつかの基本的な更新をモナドに持ち上げます。
これで自由なモナドができたので、上記のようなモナドインスタンスのさまざまな実装または意味解釈の可能性を提供する必要がありますtest
。これに対して私が思い付くことができる最良のパターンは、次の関数によって与えられます。
次に、いくつかの基本的なセマンティック関数を使用して、次の 2 つの可能な解釈を与えることができます。1 つは基本的な評価として、もう 1 つはロギングを実行するライター モナドとしてです。
これを GHCI でテストします。
これはすべて正常に機能しますが、より一般的であるか、よりよく整理されている可能性があるのではないかと少し不安に感じます. 継続を提供する関数を提供する必要があることは、最初は明らかではありませんでした。それが最善のアプローチであるかどうかはわかりません。やinterpret
など、Control.Monad.Free モジュールの関数に関して再定義するためにいくつかの努力をしました。しかし、それらはすべてうまく機能していないようです。foldFree
induce
私はこれで正しい方向に進んでいますか、それとも判断を誤っていますか? 私が見つけた自由なモナドに関する記事のほとんどは、このように実際にそれらを使用するためのパターンではなく、それらの効率またはそれらを実装するさまざまな方法に集中しています。
これをある種のSemantic
クラスにカプセル化することも望ましいと思われるので、ファンクタを newtype でラップしてこのクラスのインスタンスにすることで、フリー モナドから別のモナド インスタンスを簡単に作成できます。しかし、私はこれを行う方法を完全に理解できませんでした。
アップデート -
どちらも非常に有益で思慮深く書かれているので、両方の回答を受け入れることができればよかったのにと思います。ただし、最終的には、受け入れられた回答の編集には、私が求めていた機能が含まれています。
(retract
そしてhoistFree
Control.Monad.Free の Edward Kemmet の無料パッケージに含まれています)。
の 3 つすべてpipes
とsacundim の free-operational パッケージoperational
は 非常に関連性が高く、将来的には非常に役立つようです。皆さん、ありがとうございました。
haskell - 無料のプロキシ トランスフォーマーはありますか?
無料のプロキシ トランスフォーマーは可能だと思いますか? 何かのようなもの
これは単なる好奇心ではなく、実際に役立つと思います。
haskell - フリーモナドとファンクターのフィックスポイントの違いは?
私はhttp://www.haskellforall.com/2013/06/from-zero-to-cooperative-threads-in-33.htmlを読んでいました.ここでは、抽象構文木は、指示。フリーモナドFreeは、ファンクターFixの固定点演算子とあまり変わらないことに気付きました。
この記事では、モナド操作とdo
構文を使用して、これらの AST (フィックスポイント) を簡潔な方法で構築します。それが無料のモナドインスタンスの唯一の利点なのだろうか?それが可能にする他の興味深いアプリケーションはありますか?