問題タブ [monad-transformers]
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 - IdentityT トランスフォーマーの目的は何ですか?
トランスフォーマー パッケージを調べているときに、 IdentityTという名前のモナド トランスフォーマーを見つけました。
Identity モナドがどのように使われるか (例えばState
は単に のエイリアスであるStateT Identity
) とモナド変換子が一般的にどのように機能するかは理解していますが、それが とどのように関係しているかはわかりませんIdentityT
。
MTL には含まれていないので、完全を期すために追加されたもので、実際には使用されていないと思います。あれは正しいですか?
parsing - 通常のモナド関数をモナド変換子と同等に機能させる
バランスブラケットの問題を解決しようとしています。私は継続的な IO を実行したくありません。むしろ、getLine を 1 回呼び出して、結果の文字列を解析したいと考えています。したがって、問題を解決する関数は、入力文字列の未使用部分とブラケット スタックの 2 つの異なる状態を処理します。
スタックを操作するためのいくつかの関数をセットアップしたい:
State モナドで操作している場合はそれで問題ありませんが、StateT モナドで操作しています。
スタックに重複したモナドを持たないように言われたことは知っています。プッシュとポップの定義を単純化する方法が好きなので、私はこのようにしています。
2 つの問題:
- 何をしても、StateT に含まれるスタックにプッシュとポップを適用する方法が見つかりません。
- メイン関数からこれを呼び出す方法がわかりません
残りのコードは次のとおりです
list - リストとListTモナド変換子をきれいに変換するにはどうすればよいですか?
ListT
私は現在、モナド変換子を多用するプロジェクトを書いています。プレーンリストを使用する場合、非決定性の実装は非常に簡単です。ただし、コードをに変換する必要ListT
があると、はるかに複雑になります1。
[a]
簡単な例として、からへの変換には、ListT a
実際には2つの関数を作成する必要があります。
シンプルですが、まだそこにないのには驚きました。
質問:
- モナド変換子が必要な非決定性を処理するためのより良い方法はありますか?
- リスト間をきれいに行き来するためのテクニック/ライブラリはあり
ListT
ますか?
1正確な理由は非常に複雑なので、あまり詳しく説明したくありません。
haskell - モナドコマンドを引数として取る関数で、モナドトランスフォーマーをサポートする最良の方法は何ですか?
計算があるとしましょう
今、私が書きたいとしましょう
次に、を実装するfoo
際に、その引数を「ラップ解除」する必要がありますfoo x = lift (foo (unlift x))
。このunlift
関数は、モナド計算には適していません。状態トランスフォーマーの場合、プログラムの状態の変更を強制的に忘れることになります。
より一般的なメソッドを作成することはうまくいくようです。これはリフティング関数も取り、その結果は計算t () -> t ()
になりますt
。
質問。これが最善の方法ですか?もっと一般的なものを書くことができますか?CPS スタイルのコード? ありがとう!!
haskell - ネストされたStateTおよびErrorTモナドを適切に評価するにはどうすればよいですか?
プログラムのさまざまなレベルの制御構造に対して2つの型宣言があります。一番下は、Agent
機能付きStateT
のです。IO
2つ目は機能を備えた別のものStateT
でAgent
、3つ目(Plan
)はErrorT
。です。
評価するための最良の方法は何Plan
ですか?runStateT
私は次のコードを書きましたが、ネストされたrunErrorT
呼び出しがたくさんあるため、それほど便利ではありません。
もっとシンプルで素敵なものはありますか?
haskell - モナドトランスフォーマー内でフォークする方法
いくつかのモナド変換子スタックを考えてみましょう。
そして のいくつかの機能J
:
それから私はJ
文脈の中にいることに気づきました。私は書くことができます
J
今、コンテキスト内の別のスレッド内で quxes を覗いて印刷したい
これは明らかに機能しません。このような単純な問題を解決する方法がいくつかあると思いますが、それを理解することはできません。
haskell - モナドスタックの操作
モナドのスタック、たとえば、、、IO
およびState
とのみError
を使用する関数がある場合。関数を使用できるように、スタックから中央のモナドを「削除」するにはどうすればよいでしょうか。順序が、、、の場合、タイプを一致させるために使用できますが、モナドスタックに、場合によっては他のモナドが任意の順序で含まれている場合は、関数を使用できるようにしたいと思います。例えば:IO
Error
State
IO
Error
State
lift
IO
Error
haskell - モナド変換子でのみ外部モナドを更新する
失敗する可能性のある計算のモナドがあり、ログを記録します。
失敗しない関数がありますが、ログを記録します。
f2からのログを使用してf1のライターモナドを更新し、f2計算の出力をキャプチャするための最良の方法は何ですか?現在、私はこれを行っています:
私はリフトを使用して内部モナドを別の計算で更新しているので、ライターとどちらかのモナドを切り替えても問題は解決しません。
haskell - モナド変換子のリスト
リストモナド変換子を使用する必要があります。可換ではないため、ListT IO
fromには潜在的な問題があることを読みました。そのため、 ListTが正しく実行されていることを確認しています。しかし、予期しない動作が発生しています。Control.Monad.List
IO
この簡単なテストを考えてみましょう。
Control.Monad.Listの使用:
「ListTdoneright」の使用:
これは「ListTが正しく行われた」という問題ですか、それとも間違って使用しているだけですか?望ましい代替案はありますか?
ありがとう!