問題タブ [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 - 並べ替えられたモナド トランスフォーマー スタックの作業
私が見つけたモナド変換子の問題の 1 つはlift
、正しいモナドへの操作が必要なことです。あちこちに単一のlift
ものは悪くありませんが、次のような関数が時々あります。
この関数を次のように記述できるようにしたいと思います。
これにより、 の数が半分にlift
なり、コードがきれいになります。
問題は、どのモナドがmonadInvert
可能かということです。この関数をどのように作成する必要がありますか?
ボーナス ポイント:monad m
が のインスタンスであると定義しますMonadIO
。
この質問のタイトルは、順列について語っています。実際、モナド変換スタックの任意の順列をどのように処理できますか?
haskell - 進捗追跡用のモナド変換子
手順の進行状況を追跡するために使用できるモナド変換子を探しています。それがどのように使用されるかを説明するために、次のコードを検討してください。
step
それは一項法則のために明示的に存在するtask
必要があり、プログラムの決定論/停止性問題のために明示的なステップ数パラメーターを持たなければならないことを私は理解しています。
上記のモナドは、私が見ているように、次の2つの方法のいずれかで実装できます。
- 現在のタスク名/ステップインデックススタックを返す関数、および中断した時点でのプロシージャの継続を介して。返された継続でこの関数を繰り返し呼び出すと、プロシージャの実行が完了します。
- タスクステップが完了したときに何をすべきかを説明するアクションを実行した関数を介して。プロシージャは、提供されたアクションを介して変更について環境に「通知」し、完了するまで制御不能に実行されます。
解決策(1)についてはControl.Monad.Coroutine
、Yield
サスペンションファンクターで調べました。解決策(2)については、有用なモナド変換子がすでに利用可能かどうかはわかりません。
私が探しているソリューションは、パフォーマンスのオーバーヘッドが多すぎないようにし、手順を可能な限り制御できるようにする必要があります(たとえば、IOアクセスなどは必要ありません)。
これらの解決策の1つは実行可能に聞こえますか、それともこの問題に対する他の解決策はすでにどこかにありますか?この問題は、私が見つけられなかったモナド変換子ですでに解決されていますか?
編集:目標は、すべてのステップが実行されたかどうかを確認することではありません。目標は、プロセスの実行中にプロセスを「監視」できるようにすることです。これにより、プロセスがどれだけ完了したかを知ることができます。
haskell - Haskellモナドと文字列を必要としない失敗
Haskellのエラーを処理するために次のモナド変換子があります。
Error
カスタムクラスでインスタンス化でき、エラーを処理するための非常に柔軟な手段があるため、かなりうまく機能します。
fail
ただし、これはタイプString -> EitherT e m
であり、String
制限がエラーを作成するための厄介な方法になる可能性があるため、少しばかげています。私はたくさんのことになります:
私がやりたいのは、制限を取り除くことができるようにfail
、タイプのような新しい関数を作成することです。モナドスタックが大きくなったとき、たとえばa -> e
(Error e)
fail
fail
制限の少ないタイプと同じ動作をする関数を作成する方法はありますか?またはfail
、ディープハスケルダークマジックを使用して実装されていますか?
haskell - 存在型とモナド変換子
コンテキスト: 次のような警告のリストも追跡するエラー モナドを作成しようとしています。
ieDangerous a
は(Either e a, [w])
where e
is showable エラーとw
is showable をもたらす操作です。
問題は、主に存在型をよく理解していないため、実際に実行できないように見えることです。観察:
次の理由により、これはコンパイルされません。
道に迷いました。w1とは?だと推測できないのはなぜ~ w
ですか?
haskell - オペレーショナルモナドで実装されたライターは怠惰に動作しません
オペレーショナルモナドアプローチを使用して、ライター機能を備えたモナドを作成しました。それから私はそれが怠惰に機能しないことに気づきました。
以下のコードには、rogueWriter
それぞれが文字列を書き込む無限に多くのステートメントを実行するがあります。プログラムは終了しませんが、無限出力の一部の文字のみが必要です。
私の分析の後、私がからに変更するrunMyWriter rogueWriter
とrunWriter rogueWriter
、すべてがうまくいくので、不正なライターは実際には非常に友好的であることに気づきました(笑)。
質問:
- 行動を最もよく説明するにはどうすればよいですか?
- コードを機能させるにはどうすればよいですか?
- どのモナド変換
SomeMonadT
子がそれぞれ同じ問題を
SomeMonadT Writer w
引き起こしますか。WriterT w SomeMonad
(おそらくいくつかの例?)
編集:ここで無限の文字列を逆にしようとしている可能性はありますか?SjoerdVisscherのソリューションと私のソリューションの顕著な違いは
コード:
haskell - Maybe値をMaybeTに注入する方法
いくつか持っていfoo :: Maybe Int
て、たとえば でバインドしたいとしbar :: Int -> MaybeT (Writer String) Int
ます。それを行う慣用的な方法は何でしょうか?
独自のliftMaybe
関数を定義して、次のように使用できます。
しかし、それを行うためのより慣用的な(または少なくとも簡潔な)方法はありますか?
haskell - モナドトランスフォーマー内のモナドの結果
これは Monad Transformers との私の最初の知り合いなので、答えは明白かもしれません。
StateT MyMonad MyType 型の do ブロック内にいるとしましょう。同じ型の別の関数で状態を変更し、MyMonad MyType 型の値を返すようにしたいとします。どうすればそれを達成できますか?ここの例はguessSessionでそれを示していると思いますが、それを適用する方法を理解できないようです!
haskell - どちらにも変圧器がない場合、2つのモナドを組み合わせますか?
私はウェブアプリを書くことで遊んでいます。この場合、私はscottyとredisを使用していますが、この問題はどのWeb/DBコンボでも発生します。この前にhappstackを使用したので、そこでの例も気に入っています。
Scottyは、ネストされたモナドでルートを定義します。これにより、ルート内のデータベース接続に簡単にアクセスできます。
getのdoブロックのタイプは:Web.Scotty.ActionM ()
です。すべてのredisコマンドのタイプはDatabase.Redis.Redis a
です。redisもscottyにもモナド変換子はありません。
これらを組み合わせる最良の方法は何ですか?私はhaskellを初めて使用しますが、ReaderTをhappstackのWebモナドで動作させることができました。
keys
理想的には、両方をサポートhtml
し、同じdoブロックで新しいモナドスタックを作成することができます。
haskell - モナド変換子によるリフトの回避
モナド変換子 (または 1 つのモナド変換子) のスタックが を超える問題がありますIO
。すべてのアクションの前にリフトを使用するのがひどく面倒であることを除いて、すべてが良いです! 本当にどうしようもないと思いますが、とにかく聞いてみようと思いました。
ブロック全体を持ち上げることは承知していますが、コードが実際に混合タイプの場合はどうなるでしょうか? GHC が何らかの構文糖衣 (たとえば、<-$
= <- lift
) を入れたらいいと思いませんか?
haskell - haskell における異なる相互作用レベルの状態
私は4ビットのマイクロプロセッサをエミュレートしています。レジスタ、メモリ、および実行中の出力を追跡する必要があります (フェッチ実行サイクル カウンターもあるというボーナス ポイント)。私はモナドなしでこれを行うことができましたが、一度に多くのものを明示的に渡すのは面倒です。また、関数定義はごちゃごちゃしていて、長くて読みにくいです。
私はモナドでこれをやろうとしましたが、うまくいきません。個別の状態コンポーネントをすべて 1 つの型として扱ってみましたが、値を何にするかという問題が残りました。
意味のある唯一のタイプでした。しかし、その時点で、なぜ気にする必要があるのでしょうか。複合型から文字列を取り出して値として扱うことで、分割しようとしました
RUNNING 出力が必要だったという事実を除いて、これはうまく機能しました。私が何をしても、文字列と状態の両方を同時に保持することはできませんでした。
今、私はモナドトランスフォーマーに取り組もうとしています。さまざまなレベルの状態をすべて分離する必要があるようです。しかし、私の頭は急速に爆発しています。
FEcycle カウンターもまだ入れていません!
質問:
- 私は正しい軌道に乗っていますか?
- モナドトランスフォーマーを引き抜いているのを見て、「実行中の出力」を状態として扱うのをやめて、それを IO モナドにパームオフすることは可能ですか? それを保持する代わりに、印刷するだけでよいのです。
- 状態を何層に分ける必要がありますか? 2 つの異なる層が見えますが、それらは互いに密接に依存しています (メモリとレジスタの両方が、メモリとレジスタの両方の状態に依存しています)。ひとつにまとめておくべきか、バラバラにして積み上げるべきか。最も読みやすいコードを生成するアプローチはどれですか?