問題タブ [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 - Haskell での Cofree CoMonad の動機付けの例は何ですか?
私は で遊んでいますがCofree
、まったく理解できません。
たとえばCofree [] Num
、ghci で遊びたいのですが、興味深い例がまったく得られません。
たとえば、Cofree 型を作成すると、次のようになります。
私は期待extract a == 1
しますが、代わりに次のエラーが発生します。
そして次のタイプ:
Cofree をファンクターと一緒に使用する方法について、些細なことでも簡単な例をいくつか入手できますか[]
?Maybe
Either
extract
extend
unwrap
duplicate
?
クロス投稿: https://www.reddit.com/r/haskell/comments/4wlw70/what_are_some_motivating_examples_for_cofree/
編集: David Young のコメントに導かれて、ここに私の最初の試みが間違っていた場所を示すいくつかのより良い例がありますが、Cofree の直感を導くことができるいくつかの例が大好きです:
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
。
scala - Scala Cats: free モナドからの結果を反復処理し、それらの結果ごとに free モナド操作を実行する
次の自由モナド定義があるとしましょう:
ここで、すべてのセット名を取得し、これらのセット名ごとに idsFromSet アクションを実行したいと思います。
私はそれを次のように説明します:
しかし、理解のためにモナドを混ぜることができないので、これは不可能です。そのため、「setName <- allSetNames」の行で、コンパイラは Set が与えられており、Free が必要であると文句を言います。
周りを見回すと、モナド変換子が適しているようです。しかし、この情報では、私が見つけたモナド変換子の例は私の例からかけ離れているか、説明が抽象的すぎてこの例に実装できないように見えるため、本当に迷っています。したがって、これに関するいくつかの助けをいただければ幸いです。
編集:私はさらに一歩進んで、これを行うことで結果を達成することができます(IDのコレクションのコレクションではなく、フラット化されたIDが必要であることにも気付きました):
scala - フリーモナドの最適化
もし私が value を持っている場合、 free モナドによって結合された 2 つの s が 1 つに折りたたまれるようにa: Free[Op, A]
、 の構造を「平坦化」することは可能ですか?a
Op
コンテキスト:Op
のセマンティックは操作が冪等であるため、これを解釈前の最適化ステップとして実行したいと思います。したがって、2 つが「連続して」表示される場合、2 番目は、プログラムのセマンティクスを犠牲にすることなく削除できます。
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 が硬すぎると不平を言っています。
scala - Scala+Cats でフリー モナドを使用して任意のツリーを使用する
2 つの異なる解釈を持つ文法用のライブラリを作成しています。1) 文法に基づいて文字列を解析し、2) 文法によって定義された言語で文字列を生成します。
ライブラリは cat を使用して、文法の AST をフリー モナドとして作成します。しかし、自由なモナドは私の AST のリストのような表現を作成し、これはステートメント リストに適しているため、完全には適合しないように思われますが、文法はステートメント リストとはかけ離れており、任意のツリー構造にはるかに近いものです。
~
演算子を使用して連結された 2 つの文法を示すことで、ツリーを実装することができました。AST は、それ自体が任意の AST である文法のリストです。
私の質問は: フリー モナドで AST のサブツリーを再帰する良い方法は何ですか?
私の現在の実装はここにあります:
Multi
サブツリーを再帰的に解釈するために、このケースでは安全でない再帰 (つまり、末尾再帰ではない) が使用されていることに特に注意してください。これを行うより良い方法はありますか?
haskell - free モナドを使ったロギング
この質問はこの記事に関連しています
アイデアは、クラウド内のファイルを操作するための DSL を定義し、REST インターフェースとの通信やロギングなど、さまざまな側面を処理するインタープリターの構成を定義することです。
これをより具体的にするために、DSL の用語を定義する次のデータ構造があると仮定します。
CloudFiles プログラムを構築するための関数を次のように定義します。
次に、これを他の 2 つの DSL の観点から解釈します。
次のタイプを使用して、CloudFiles DSL から REST DSL への自然な変換を定義することができました。
次に、次の形式のプログラムが与えられます。
次のように、REST 呼び出しを使用してプログラムを解釈することができます。
ログを使用して DSL の解釈を定義しようとすると、問題が発生します。上記で参照した記事では、著者は次のタイプのインタープリターを定義しています。
そして、型を持つためのインタプリタを定義しますFree LogF a
:
問題は、このインタープリターを上記のように組み合わせて使用できないこと
foldFree
です。問題は、
上記で
定義されFree CloudFilesF a
た関数を使用してプログラムを解釈する方法です。基本的に、私は次のタイプの関数を構築しようとしています:logCloudfilesI
interpretLog
これは REST DSL で実行できますが、usng では実行できませんlogCloudfilesI
。
これらの状況でフリーモナドを使用する場合、どのようなアプローチが取られますか? ListFiles
問題は、ロギングの場合、プログラムの継続を構築するために関数に提供できる意味のある値がないという事実にあるように思われることに注意してください。
著者が使用する2 番目の記事では、ただし、これは現在の実装Halt
では機能しません。