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

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

haskell - 一時停止モナド

モナドは多くの驚くべき、クレイジーなことをすることができます。それらは、値の重ね合わせを保持する変数を作成できます。それらはあなたがそれを計算する前にあなたが未来からのデータにアクセスすることを可能にすることができます。彼らはあなたが破壊的な更新を書くことを可能にすることができますが、実際にはそうではありません。そして、継続モナドはあなたが人々の心を壊すことを可能にします!通常はあなた自身のものです。;-)

しかし、ここに課題があります。一時停止できるモナドを作成できますか?

Pauseモナドは一種の状態モナドです(したがって、mutate明白なセマンティクスを備えています)。通常、このようなモナドには、計算を実行して最終状態を返す、ある種の「実行」関数があります。ただしPause、違います。step魔法の関数を呼び出すまで計算を実行する関数を提供しyieldます。ここで計算は一時停止され、後で計算を再開するのに十分な情報が呼び出し元に返されます。

さらに素晴らしい場合:呼び出し元が呼び出し間の状態を変更できるようにしstepます。(たとえば、上記の型署名はこれを可能にするはずです。)


ユースケース:複雑なことを行うコードを書くのは簡単なことがよくありますが、それを変換して操作の中間状態も出力するための完全なPITAです。ユーザーが実行の途中で何かを変更できるようにしたい場合、物事は非常に速く複雑になります。

実装のアイデア:

  • 明らかに、それはスレッド、ロック、およびで行うことができますIO。しかし、もっとうまくやれるでしょうか?;-)

  • 継続モナドで何かおかしなことはありますか?

  • たぶん、ある種のライターモナドで、現在の状態をログに記録するだけで、ログ内の状態を反復処理することで、そのyieldふりをすることができます。step(明らかに、これにより、ステップ間で状態を変更することはできなくなります。これは、現在、実際には何も「一時停止」していないためです。)

0 投票する
7 に答える
61846 参照

haskell - 無料のモナドとは何ですか?

Free Monadという用語が時々出てくるの見てきました もがそれらが何であるかを説明せずにそれらを使用/議論しているようです。だから:無料のモナドとは何ですか?(私はモナドとHaskellの基本に精通していると思いますが、圏論については非常に大まかな知識しか持っていません。)

0 投票する
3 に答える
1223 参照

haskell - `Free`にMonadFixを実装することは可能ですか?

http://hackage.haskell.org/package/free inをControl.Monad.Free.Free使用すると、任意のの「無料モナド」にアクセスできますFunctor。ただし、MonadFixインスタンスはありません。これは、そのようなインスタンスを記述できないためですか、それとも単に省略されたためですか?

そのようなインスタンスを書き込めないのなら、どうしてですか?

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

haskell - あるファンクター上の Free として表現できるモナドは?

ドキュメントにFreeは次のように書かれています:

多くの一般的なモナドが自由モナドとして発生し、

  • 与えられdata Empty aたは、モナドFree Emptyに同型です。Identity
  • FreeMaybeを使用して、各層が計算をしばらく実行することを表す部分モナドをモデル化できます。

を使用して表現できる他のモナドは何Freeですか?

もう 1 つしか考えられませんでしFree (Const e)Either e

編集:使用して表現できないモナドFreeとその理由は?

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

haskell - モナドの無料モナド

x >>= f同等retract (liftF x >>= liftF . f)ですか?

つまり、モナドでもあるファンクターからの無料のモナドビルドのモナドインスタンスは、元のモナドと同等のモナドインスタンスを持つことになりますか?

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

haskell - これらのフリーのような構造の一般化はありますか?

私は自由なアイデアで遊んでいて、これを見つけました:

関数を書くことができる条件を見つけたい:

しかし、この関数を書くことを可能にする意味のある構造を見つけることができませんでした( のメソッドでfある簡単なものを除く)。特に私の美的センスは、この構造がタイプに言及していないことを好みます。mkFree???Free

誰かが前にこのようなものを見たことがありますか? この一般化は可能ですか?私がまだ考えていない方向への既知の一般化はありますか?

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

haskell - free モナドを使って Reader を実装するにはどうすればよいですか?

わかりましたので、パッケージを使用して実装する方法を理解しましたReader(および、表示されていません):ReaderToperational

しかし、これを無料のモナドで行う方法を一生理解できません (私は Edward Kmett のfreeパッケージを使用しています)。私が得た最も近いものはこれです。これは不正行為であると理解しています((->) r)(すでにモナドである方法についての何か):

これが私が思っているほど愚かではなかったとしても、基本的に私が欲しいのはReaderデータとして検査できるようにすることなので、それは私が望むものではありません...

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

haskell - フリーモナドへのセマンティクスの適用

私は、特定のセマンティクスをファンクター上のフリー モナドに適用するパターンを抽象化しようとしています。これを動機付けるために私が使用している実行中の例は、ゲーム内のエンティティに更新を適用することです。そこで、いくつかのライブラリをインポートし、この例の目的のためにいくつかの型とエンティティ クラスを定義します (私は control-monad-free で free モナド実装を使用しています):

ここで、いくつかの基本的な更新をモナドに持ち上げます。

これで自由なモナドができたので、上記のようなモナドインスタンスのさまざまな実装または意味解釈の可能性を提供する必要がありますtest。これに対して私が思い付くことができる最良のパターンは、次の関数によって与えられます。

次に、いくつかの基本的なセマンティック関数を使用して、次の 2 つの可能な解釈を与えることができます。1 つは基本的な評価として、もう 1 つはロギングを実行するライター モナドとしてです。

これを GHCI でテストします。

これはすべて正常に機能しますが、より一般的であるか、よりよく整理されている可能性があるのではないかと少し不安に感じます. 継続を提供する関数を提供する必要があることは、最初は明らかではありませんでした。それが最善のアプローチであるかどうかはわかりません。やinterpretなど、Control.Monad.Free モジュールの関数に関して再定義するためにいくつかの努力をしました。しかし、それらはすべてうまく機能していないようです。foldFreeinduce

私はこれで正しい方向に進んでいますか、それとも判断を誤っていますか? 私が見つけた自由なモナドに関する記事のほとんどは、このように実際にそれらを使用するためのパターンではなく、それらの効率またはそれらを実装するさまざまな方法に集中しています。

これをある種のSemanticクラスにカプセル化することも望ましいと思われるので、ファンクタを newtype でラップしてこのクラスのインスタンスにすることで、フリー モナドから別のモナド インスタンスを簡単に作成できます。しかし、私はこれを行う方法を完全に理解できませんでした。

アップデート -

どちらも非常に有益で思慮深く書かれているので、両方の回答を受け入れることができればよかったのにと思います。ただし、最終的には、受け入れられた回答の編集には、私が求めていた機能が含まれています。

(retractそしてhoistFreeControl.Monad.Free の Edward Kemmet の無料パッケージに含まれています)。

の 3 つすべてpipessacundim の free-operational パッケージoperationalは 非常に関連性が高く、将来的には非常に役立つようです。皆さん、ありがとうございました。

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

haskell - 無料のプロキシ トランスフォーマーはありますか?

無料のプロキシ トランスフォーマーは可能だと思いますか? 何かのようなもの

これは単なる好奇心ではなく、実際に役立つと思います。

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

haskell - フリーモナドとファンクターのフィックスポイントの違いは?

私はhttp://www.haskellforall.com/2013/06/from-zero-to-cooperative-threads-in-33.htmlを読んでいました.ここでは、抽象構文木は、指示。フリーモナドFreeは、ファンクターFixの固定点演算子とあまり変わらないことに気付きました。

この記事では、モナド操作とdo構文を使用して、これらの AST (フィックスポイント) を簡潔な方法で構築します。それが無料のモナドインスタンスの唯一の利点なのだろうか?それが可能にする他の興味深いアプリケーションはありますか?