問題タブ [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 に答える
204 参照

haskell - HaskellのFreeモナドでPureはどういう意味ですか?

私はフリーモナドを学ぼうとしています。私は以下を見つけました:

Pure とはどういう意味ですか? また、Pure で r が必要なのはなぜですか?

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

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 でパターン マッチを行うことはできますか? 一貫した一般的な方法でツリーをトラバースできますか (ジッパー、トラバーサブルなど)。ここで一般的に取られるアプローチは何ですか?

ファイル全体は次のとおりです。

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

haskell - フリーモナドを使って継続モナドをどのように表現することができますか?

おそらく、すべてのモナドは次を使用して表現できますFree(これが正しくない場合、反例とは何ですか?その理由は何ですか)? 継続モナドまたはそれに対応する変換子は、or を使用してどのように表現FreeできますFreeTか?対応するファンクターは何でしょうか? または、できない場合、その理由は何ですか?

更新:表現とは、基本的にwhereが探しているファンクタと同型Free Fであることを意味します。たとえば、は と同型です。FWriter wFree ((,) w)

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

haskell - フリー代替ファンクターから optparse-applicative パーサーを生成する

次の型シグネチャを検討してください。

ここで、 からの型Fooへの自然な変換を示します。optparse-applicativeParser

(わかりました、それは少し役に立ちませんが、議論には役立ちます)。

今、私Barは自由な代替ファンクターであるとしFooます:

これがフリー ファンクターであることを考えると、 からへmkParserの自然な変換に移行できるはずです。BarParser

そして確かに、これは機能し、私にParser戻ってきます。ただし、それを多くのことをしようとすると無限ループになるため、これはかなり役に立たないものです。たとえば、それを説明しようとすると:

そして、中断されるまでハングアップします。

この理由は、 andの定義をoptparse-applicative ごまかすためのようです: カバーの下でモナド構文解析を使用します。manysome

ここで何か間違ったことをしていますか?これを考えると、この方法でパーサーを構築する方法がわかりません。何か案は?

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

haskell - 構文木: free モナド + Bound.Scope

ekmett のライブラリboundとを使用して抽象構文型を定義しようとしていますfree。私は次の最小限の例に落とし込むことができる何かが働いています:

最後の 2 行は、私が望んでいたものではありません。彼らは、オープンな再帰を実際に注釈 (または何でも) に悪用することを一種の PITA にしています。

Termこれら 2 つのライブラリを一緒に使用するより良い方法はありますか? また、フリーのモナドを作成することをあきらめるべきでしょうか?

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

scala - Scala でブログ フィードを生成する無料の Monad

ブログ サイトの RSS/Atom フィードの生成を追加する必要があるとします。「Feed Monad Interpreter」パターンを考えています。つまり、プリミティブBlogBlogPost、これらのプリミティブの単なるツリーである a 、およびツリーを XMLFree monadに変換する RSS/Atom の「インターピーター」を使用して DSL を定義します。Free monad

それは理にかなっていますか?

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

scala - Scala で Free モナドを作成する

Freeモナドとは何かを理解していると思います。ファンクターは構成しますが、モナドは構成しないことも理解していただければ幸いです。つまり、M1M2がモナドである場合、M1[M2]必ずしもモナドとは限りません。

私の質問は次のとおりです。

  • Freeモナドは構成しますか?
  • ファンクタF1andF2とその合成があるとしF1[F2]ます。またFree1、and Free2-- andFreeのモナドがあるF1としF2ます。with だけでFreeモナドを定義できますか? F1[F2]Free1Free2