有没有办法使用" unlift"在monad变压器写入块时的样式?

时间:2015-10-21 20:06:51

标签: haskell refactoring monads monad-transformers

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中有类似的效果?

0 个答案:

没有答案