問題タブ [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のFreeモナドでPureはどういう意味ですか?
私はフリーモナドを学ぼうとしています。私は以下を見つけました:
Pure とはどういう意味ですか? また、Pure で r が必要なのはなぜですか?
haskell - Haskell の Free モナド上に構築された AST のナビゲートと変更
オンラインで読んだ参考文献に基づいて Free モナドを使用して AST を構築しようとしています。
これらの種類の AST を実際に使用することについていくつか質問があります。それを次の例にまとめました。
私の言語で次のコマンドが許可されているとします。
Free モナドのボイラープレートを手動で定義します。
これにより、次のようなプログラムを指定できます。
ここで、プログラムを実行したいと思います。これは非常に単純に思えます。
と
わかった。それはそれでいいのですが、今度は自分の AST について学び、それに変換を実行したいと思います。コンパイラでの最適化のように考えてください。
簡単なものを次に示します。Repeat
ブロックにコマンドしか含まれていない場合DisplayChar
、全体を適切なDisplayString
. repeat 2 (displayChar 'A' >> displayChar 'B')
つまり、 で変身したいdisplayString "ABAB"
。
これが私の試みです:
GHCI で AST を観察すると、これが正しく機能していることがわかります。
しかし、私は幸せではありません。私の意見では、このコードは反復的です。AST を調査するたびに AST をトラバースする方法を定義するかproject
、ビューを提供する my のような関数を定義する必要があります。ツリーを変更したいときは、これと同じことをしなければなりません。
だから、私の質問:このアプローチは私の唯一の選択肢ですか?大量のネストを処理せずに AST でパターン マッチを行うことはできますか? 一貫した一般的な方法でツリーをトラバースできますか (ジッパー、トラバーサブルなど)。ここで一般的に取られるアプローチは何ですか?
ファイル全体は次のとおりです。
haskell - フリー代替ファンクターから optparse-applicative パーサーを生成する
次の型シグネチャを検討してください。
ここで、 からの型Foo
への自然な変換を示します。optparse-applicative
Parser
(わかりました、それは少し役に立ちませんが、議論には役立ちます)。
今、私Bar
は自由な代替ファンクターであるとしFoo
ます:
これがフリー ファンクターであることを考えると、 からへmkParser
の自然な変換に移行できるはずです。Bar
Parser
そして確かに、これは機能し、私にParser
戻ってきます。ただし、それを多くのことをしようとすると無限ループになるため、これはかなり役に立たないものです。たとえば、それを説明しようとすると:
そして、中断されるまでハングアップします。
この理由は、 andの定義をoptparse-applicative
ごまかすためのようです: カバーの下でモナド構文解析を使用します。many
some
ここで何か間違ったことをしていますか?これを考えると、この方法でパーサーを構築する方法がわかりません。何か案は?
haskell - 構文木: free モナド + Bound.Scope
ekmett のライブラリbound
とを使用して抽象構文型を定義しようとしていますfree
。私は次の最小限の例に落とし込むことができる何かが働いています:
最後の 2 行は、私が望んでいたものではありません。彼らは、オープンな再帰を実際に注釈 (または何でも) に悪用することを一種の PITA にしています。
Term
これら 2 つのライブラリを一緒に使用するより良い方法はありますか? また、フリーのモナドを作成することをあきらめるべきでしょうか?
scala - Scala でブログ フィードを生成する無料の Monad
ブログ サイトの RSS/Atom フィードの生成を追加する必要があるとします。「Feed Monad Interpreter」パターンを考えています。つまり、プリミティブBlog
とBlogPost
、これらのプリミティブの単なるツリーである a 、およびツリーを XMLFree monad
に変換する RSS/Atom の「インターピーター」を使用して DSL を定義します。Free monad
それは理にかなっていますか?
scala - Scala で Free モナドを作成する
Free
モナドとは何かを理解していると思います。ファンクターは構成しますが、モナドは構成しないことも理解していただければ幸いです。つまり、M1
とM2
がモナドである場合、M1[M2]
は必ずしもモナドとは限りません。
私の質問は次のとおりです。
Free
モナドは構成しますか?- ファンクタ
F1
andF2
とその合成があるとしF1[F2]
ます。またFree1
、andFree2
-- andFree
のモナドがあるF1
としF2
ます。with だけでFree
モナドを定義できますか?F1[F2]
Free1
Free2