問題タブ [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 - MonadPlus 操作のシーケンスを漸近的に最適化する Codensity MonadPlus はありますか?
最近、 <-> と <->の関係について質問がありました。DList
[]
Codensity
Free
にこんなものがあるのだろうかと考えさせられたMonadPlus
。Codensity
モナドは、 ではなく、モナド演算に対してのみ漸近性能を向上させますmplus
。
さらに、以前は がありましたがControl.MonadPlus.Free
、 のために削除されましたFreeT f []
。また、明示的な free がないため、対応するバリアントMonadPlus
をどのように表現するかわかりません。improve
おそらく次のようなもの
?
更新:バックトラッキング モナドを使用してそのようなモナドを作成しようとしましたがLogicT
、これは次のような方法で定義されているようCodensity
です:
であり、バックトラッキング計算、つまり に適していMonadPlus
ます。
次に、次lowerLogic
のようにを定義lowerCodensity
しました。
次に、対応するMonadFree
インスタンスを補足した後
定義できる
k
ただし、私の最初の実験から、いくつかの例では が とは異なるように見えるため、何かが正しくありませんimprovePlus k
。これが基本的な制限でLogicT
あり、別のより複雑なモナドが必要なのか、それとも定義lowerLogic
(または他の何か) が間違っているのかはわかりません。
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 モナドは私が試した最初のものです。
haskell - フリーモナドとして指定されたプログラムと、予想される命令の記述を比較するにはどうすればよいですか?
だから私は何か斬新なことをしようとしていますが (私はそう思います)、Haskell 型レベルのプログラミングの経験が十分ではなく、それを自分で解決することができません。
実行するいくつかの効果を記述した無料のモナドを持っています (それがあなたのやり方なら AST です)。期待される効果の説明に対してそれを解釈したいと思います。
これまでの私のコードは次のとおりです::
それが「コア」コードです。プログラムの例を次に示します。
このプログラムをテストするために、次runTest :: Free DSL a -> _ -> Maybe a
のようにプログラムと「期待される効果」の仕様を漠然と取るfunction を使用したいと思います。
そして、プログラムが実行する各効果をリスト内の次の項目と照合することにより、プログラムを解釈しexpect
ます。次に、関連付けられた値 (各ペアの 2 番目の項目) が、その効果の結果としてプログラムに返されます。すべての効果が一致する場合、プログラムの最終結果は として返されますJust
。何かが一致しない場合は、Nothing
返される必要があります (後で、有益なエラー メッセージを返すようにこれを拡張します)。
もちろん、このタプルは役に立ちません。その型は非常に巨大なものであり、ジェネリック関数をexpect
書き込めないからです。runTest
私が抱えている主な問題は、どのようなプログラムに対してもどのようなシーケンスでも機能する関数を記述できるように、この予想される意図のシーケンスをどのように表現すべきかということですFree DSL a
。
- Haskell のさまざまな高度な型レベルの機能については漠然と認識していますが、どの機能を使用する必要があるかについてはまだ経験がありません。
- シーケンスに HList などを使用する必要があり
expected
ますか?
調べるためのヒントは大歓迎です。