假设我有一些foo :: Maybe Int
并且我想将它与例如绑定bar :: Int -> MaybeT (Writer String) Int
,那么惯用的方法是什么?
我可以定义自己的liftMaybe
函数,然后使用它,例如:
let liftMaybe = maybe (fail "Nothing") return in liftMaybe foo >>= bar
但是有没有更惯用(或至少简洁)的方式来做到这一点?
假设我有一些foo :: Maybe Int
并且我想将它与例如绑定bar :: Int -> MaybeT (Writer String) Int
,那么惯用的方法是什么?
我可以定义自己的liftMaybe
函数,然后使用它,例如:
let liftMaybe = maybe (fail "Nothing") return in liftMaybe foo >>= bar
但是有没有更惯用(或至少简洁)的方式来做到这一点?
MaybeT . return :: (Monad m) => Maybe a -> MaybeT m a
我认为它没有标准名称很遗憾,但是进行hoogle 搜索,我们看到relude
包使用hoistMaybe
:
hoistMaybe :: Applicative m => Maybe a -> MaybeT m a
更一般的形式是
liftMaybe :: (MonadPlus m) => Maybe a -> m a
liftMaybe = maybe mzero return
这比使用fail
. 我只是把它放在某个方便的模块中。