だから私は最初の本格的な haskell プロジェクト全体にこの種のコードを持っています:
f :: (MonadTrans t) => ExceptT () (t (StateT A B)) C
f = do mapExceptT lift $ do
lift $ do
...
lift $ do
...
r <- ...
...
return r
>>= \r -> ...
私の目標を達成しようとする方法には間違いなく何か問題があるかもしれません (もっと簡単な方法があるかもしれません) が、現在、モナド変換子のスタックをより良い方法で処理する方法を学ぶことに興味があります。r
これは、スタック内のより高いモナドにコンテキストを取得してB
持ち上げる方法を見つけた唯一の方法です。最初のステートメントの代わりにブロック全体を持ち上げることは、私が自分でできる限りです。
私がしばしば行き着くのは、深いモナドがlift
である場合に回避できることがわかったチェーンです。ただし、他のモナドの一般的な方法については知りません。liftIO
IO
そのようなスタックを処理し、あるレベルで 1 つの値を抽出し、別のレベルで別の値を抽出し、これらを組み合わせて 2 つのレベルのいずれかに影響を与えたり、さらに別のレベルに影響を与えたりする必要がある場合に従うことができるパターンはありますか?
ブロック全体を持ち上げたり (let
バインドされた変数の範囲を限定したり、内側のブロックに制限したりする)、lift . lift . ... lift
個々のアクションを実行することなく、スタックを何らかの方法で操作できますか?