Haskell中的许多monad变换器只向基本monad添加一个函数,例如:
MaybeT adds mzero
ExceptT adds throwE
Producer adds yield
Consumer adds await
所以在一个IO
- 重型或复杂嵌套的monad中,我通常会写一个do
- 像这样的块
do
liftIO $ ...
liftIO $ ...
if ...
then
liftIO $ ...
else
mzero
liftIO $ ...
liftIO $ ...
liftIO $ ...
这是非常不必要的,因为我可能只是将mzero
用于那个特定的陈述。如果我只能改变" unlift"那就不好了。必要时,正常写下剩余的块吗?想象一下,我可以写
lift $ do
...
...
if ...
then
...
else
unlift $ mzero
...
...
...
我知道上面的代码没有意义,因为被解除的do
- 块将是一个普通的monad并且特效不会出现,但是有没有办法实现某些东西在Haskell中有类似的效果?