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

haskell - MonadPlus 操作のシーケンスを漸近的に最適化する Codensity MonadPlus はありますか?

最近、 <-> と <->の関係について質問がありました。DList[]CodensityFree

にこんなものがあるのだろうかと考えさせられたMonadPlusCodensityモナドは、 ではなく、モナド演算に対してのみ漸近性能を向上させますmplus

さらに、以前は がありましたがControl.MonadPlus.Free、 のために削除されましたFreeT f []。また、明示的な free がないため、対応するバリアントMonadPlusをどのように表現するかわかりません。improveおそらく次のようなもの

?


更新:バックトラッキング モナドを使用してそのようなモナドを作成しようとしましたがLogicT、これは次のような方法で定義されているようCodensityです:

であり、バックトラッキング計算、つまり に適していMonadPlusます。

次に、次lowerLogicのようにを定義lowerCodensityしました。

次に、対応するMonadFreeインスタンスを補足した後

定義できる

kただし、私の最初の実験から、いくつかの例では が とは異なるように見えるため、何かが正しくありませんimprovePlus k。これが基本的な制限でLogicTあり、別のより複雑なモナドが必要なのか、それとも定義lowerLogic(または他の何か) が間違っているのかはわかりません。

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

haskell - Free の MonadReader インスタンスを活用するにはどうすればよいですか?

Free モナドを使用して作成した DSL で Reader を使用したいと考えています。

ここに無料の MonadReader のインスタンスがあることに気付きました。

https://hackage.haskell.org/package/free-4.12.1/docs/src/Control-Monad-Free.html#line-264

EDSL で記述したプログラム内で呼び出そうとするとask、「No such instance MonadReader Free MyDSL」というタイプ エラーが発生します。

最終的には MonadError や Logging モナドなどの DSL で他のモナドを使いたいと思うでしょうが、Reader モナドは私が試した最初のものです。

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

haskell - フリーモナドとして指定されたプログラムと、予想される命令の記述を比較するにはどうすればよいですか?

だから私は何か斬新なことをしようとしていますが (私はそう思います)、Haskell 型レベルのプログラミングの経験が十分ではなく、それを自分で解決することができません。

実行するいくつかの効果を記述した無料のモナドを持っています (それがあなたのやり方なら AST です)。期待される効果の説明に対してそれを解釈したいと思います。

これまでの私のコードは次のとおりです::

それが「コア」コードです。プログラムの例を次に示します。

このプログラムをテストするために、次runTest :: Free DSL a -> _ -> Maybe aのようにプログラムと「期待される効果」の仕様を漠然と取るfunction を使用したいと思います。

そして、プログラムが実行する各効果をリスト内の次の項目と照合することにより、プログラムを解釈しexpectます。次に、関連付けられた値 (各ペアの 2 番目の項目) が、その効果の結果としてプログラムに返されます。すべての効果が一致する場合、プログラムの最終結果は として返されますJust。何かが一致しない場合は、Nothing返される必要があります (後で、有益なエラー メッセージを返すようにこれを拡張します)。

もちろん、このタプルは役に立ちません。その型は非常に巨大なものであり、ジェネリック関数をexpect書き込めないからです。runTest私が抱えている主な問題は、どのようなプログラムに対してもどのようなシーケンスでも機能する関数を記述できるように、この予想される意図のシーケンスをどのように表現すべきかということですFree DSL a

  1. Haskell のさまざまな高度な型レベルの機能については漠然と認識していますが、どの機能を使用する必要があるかについてはまだ経験がありません。
  2. シーケンスに HList などを使用する必要がありexpectedますか?

調べるためのヒントは大歓迎です。