問題タブ [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 投票する
1 に答える
4979 参照

haskell - Haskell での Cofree CoMonad の動機付けの例は何ですか?

私は で遊んでいますがCofree、まったく理解できません。

たとえばCofree [] Num、ghci で遊びたいのですが、興味深い例がまったく得られません。

たとえば、Cofree 型を作成すると、次のようになります。

私は期待extract a == 1しますが、代わりに次のエラーが発生します。

そして次のタイプ:

Cofree をファンクターと一緒に使用する方法について、些細なことでも簡単な例をいくつか入手できますか[]?MaybeEither

  • extract
  • extend
  • unwrap
  • duplicate?

クロス投稿: https://www.reddit.com/r/haskell/comments/4wlw70/what_are_some_motivating_examples_for_cofree/

編集: David Young のコメントに導かれて、ここに私の最初の試みが間違っていた場所を示すいくつかのより良い例がありますが、Cofree の直感を導くことができるいくつかの例が大好きです:

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

haskell - プロファンクターの自由モナドの類似物

を定義することができdata Free f a = Pure a | Free (f (Free f a))ますFunctor f => Monad (Free f)

私たちが定義し た場合、私data T f a b = R a | S b | T (f a (T f a b))たちはいくつかの類似物を持っているMのでProfunctor f => M (T f a)、どこでclass Profunctor f where dimap :: (a -> b) -> (c -> d) -> f b c -> f a d

私が指摘Data.Comp.Term.Contextして以来ずっと疑問に思っておりFree、 の潜在的な類似物について同形ですData.Comp.Param.Term.Context

0 投票する
0 に答える
162 参照

scala - Scala Cats: free モナドからの結果を反復処理し、それらの結果ごとに free モナド操作を実行する

次の自由モナド定義があるとしましょう:

ここで、すべてのセット名を取得し、これらのセット名ごとに idsFromSet アクションを実行したいと思います。

私はそれを次のように説明します:

しかし、理解のためにモナドを混ぜることができないので、これは不可能です。そのため、「setName <- allSetNames」の行で、コンパイラは Set が与えられており、Free が必要であると文句を言います。

周りを見回すと、モナド変換子が適しているようです。しかし、この情報では、私が見つけたモナド変換子の例は私の例からかけ離れているか、説明が抽象的すぎてこの例に実装できないように見えるため、本当に迷っています。したがって、これに関するいくつかの助けをいただければ幸いです。

編集:私はさらに一歩進んで、これを行うことで結果を達成することができます(IDのコレクションのコレクションではなく、フラット化されたIDが必要であることにも気付きました):

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

scala - フリーモナドの最適化

もし私が value を持っている場合、 free モナドによって結合された 2 つの s が 1 つに折りたたまれるようにa: Free[Op, A]、 の構造を「平坦化」することは可能ですか?aOp

コンテキスト:Opのセマンティックは操作が冪等であるため、これを解釈前の最適化ステップとして実行したいと思います。したがって、2 つが「連続して」表示される場合、2 番目は、プログラムのセマンティクスを犠牲にすることなく削除できます。

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

haskell - Free Applicative の例でコンパイラが Functor 型を推測できないのはなぜですか?


Free Monad を理解するためにこのチュートリアルを終了し、演習として Applicative 関数も実行しようとしています。正直なところ、これらのエラーが何を意味するのかわかりません。

data FixE f e = Fix (f (FixE f e)) | Throw eまた、 の型シグネチャが正確にどうあるべきかわかりません。f (FixE f e)最初はタプルのはずだと思っていましたが、1つの引数のように見えるため、(FixE f e)実際には最初の の型引数fです。しかし、そうであれば、f内部にFixE f eも型引数が必要ではないでしょうか?

編集:

何よりも、この最後の部分がわかりません。また、ファンクターのインスタンスを正確に定義する必要があるのは何ですか? fは、上記の定義ですでにその制約を持っている必要があります。

Edit2: おそらく、FixE には Functor インスタンスが必要だということです。

これが私のベストショットですが、最初の行で型 f が硬すぎると不平を言っています。

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

scala - Scala+Cats でフリー モナドを使用して任意のツリーを使用する

2 つの異なる解釈を持つ文法用のライブラリを作成しています。1) 文法に基づいて文字列を解析し、2) 文法によって定義された言語で文字列を生成します。

ライブラリは cat を使用して、文法の AST をフリー モナドとして作成します。しかし、自由なモナドは私の AST のリストのような表現を作成し、これはステートメント リストに適しているため、完全には適合しないように思われますが、文法はステートメント リストとはかけ離れており、任意のツリー構造にはるかに近いものです。

~演算子を使用して連結された 2 つの文法を示すことで、ツリーを実装することができました。AST は、それ自体が任意の AST である文法のリストです。

私の質問は: フリー モナドで AST のサブツリーを再帰する良い方法は何ですか?

私の現在の実装はここにあります:

Multiサブツリーを再帰的に解釈するために、このケースでは安全でない再帰 (つまり、末尾再帰ではない) が使用されていることに特に注意してください。これを行うより良い方法はありますか?

ソースコードについては、ここをクリックしてください。

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

haskell - free モナドを使ったロギング

この質問はこの記事に関連しています

アイデアは、クラウド内のファイルを操作するための DSL を定義し、REST インターフェースとの通信やロギングなど、さまざまな側面を処理するインタープリターの構成を定義することです。

これをより具体的にするために、DSL の用語を定義する次のデータ構造があると仮定します。

CloudFiles プログラムを構築するための関数を次のように定義します。

次に、これを他の 2 つの DSL の観点から解釈します。

次のタイプを使用して、CloudFiles DSL から REST DSL への自然な変換を定義することができました。

次に、次の形式のプログラムが与えられます。

次のように、REST 呼び出しを使用してプログラムを解釈することができます。

ログを使用して DSL の解釈を定義しようとすると、問題が発生します。上記で参照した記事では、著者は次のタイプのインタープリターを定義しています。

そして、型を持つためのインタプリタを定義しますFree LogF a:

問題は、このインタープリターを上記のように組み合わせて使用​​できないこと foldFreeです。問題は、 上記で 定義されFree CloudFilesF aた関数を使用してプログラムを解釈する方法です。基本的に、私は次のタイプの関数を構築しようとしています:logCloudfilesIinterpretLog

これは REST DSL で実行できますが、usng では実行できませんlogCloudfilesI

これらの状況でフリーモナドを使用する場合、どのようなアプローチが取られますか? ListFiles問題は、ロギングの場合、プログラムの継続を構築するために関数に提供できる意味のある値がないという事実にあるように思われることに注意してください。 著者が使用する2 番目の記事では、ただし、これは現在の実装Haltでは機能しません。