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虽然显而易见,却没有出现.