如何在MaybeT中注入Maybe值

use*_*763 24 haskell monad-transformers

说我有一些foo :: Maybe Int,我想绑定它,例如bar :: Int -> MaybeT (Writer String) Int,这是什么惯用的方法呢?

我可以定义自己的liftMaybe函数,然后使用它,如:

let liftMaybe = maybe (fail "Nothing") return in liftMaybe foo >>= bar
Run Code Online (Sandbox Code Playgroud)

但是,是否有更惯用(或至少简洁)的方式呢?

ehi*_*ird 23

MaybeT . return :: (Monad m) => Maybe a -> MaybeT m a
Run Code Online (Sandbox Code Playgroud)

我觉得很遗憾它没有标准名称.更一般的形式是

liftMaybe :: (MonadPlus m) => Maybe a -> m a
liftMaybe = maybe mzero return
Run Code Online (Sandbox Code Playgroud)

这比使用更好fail.我只是把它放在一个方便的模块中.

Hayoo 为这个功能展示了各种各样的名字 ; 那些,maybeZero是我的最爱.liftMaybe虽然显而易见,却没有出现.

  • `errors`包命名为`hoistMaybe`:https://hackage.haskell.org/package/errors-1.4.7/docs/Control-Error-Util.html (2认同)