所以我在我的第一个严肃的haskell项目中都有这种代码:
f :: (MonadTrans t) => ExceptT () (t (StateT A B)) C
f = do mapExceptT lift $ do
lift $ do
...
lift $ do
...
r <- ...
...
return r
>>= \r -> ...
我如何尝试实现我的目标肯定可能有问题(可能有更简单的方法来做到这一点)但目前我有兴趣学习如何以更好的方式处理一堆 monad 转换器,如果有的话。这是我弄清楚如何进入r
上下文B
并将其提升到堆栈中更高的单子的唯一方法。举起整个块而不是最初的陈述是我自己能做到的。
我还经常得到的是我发现如果深层单子是lift
可以避免的链。不过,我不知道其他单子的通用方式。liftIO
IO
当他最终处理这样的堆栈时,是否有一种模式可以遵循,并且必须在某个级别提取一个值,在不同级别提取一个不同的值,结合这些并影响两个级别中的任何一个级别,或者可能还有另一个级别?
是否可以以某种方式操纵堆栈而无需提升整个块(这导致let
和绑定变量的范围和限制到内部块),也不必lift . lift . ... lift
单独操作?