说我有一些foo :: Maybe Int
例如,我想将它与 bar :: Int -> MaybeT (Writer String) Int
绑定(bind),这样做的惯用方法是什么?
我可以定义自己的liftMaybe
函数,然后使用它,例如:
let liftMaybe = maybe (fail "Nothing") return in liftMaybe foo >>= bar
但是有没有更惯用(或至少简洁)的方式来做到这一点?
最佳答案
MaybeT . return :: (Monad m) => Maybe a -> MaybeT m a
我认为它没有标准名称是一种耻辱,但是做 a hoogle search ,我们看到 relude
包使用 hoistMaybe
:hoistMaybe :: Applicative m => Maybe a -> MaybeT m a
更一般的形式是
liftMaybe :: (MonadPlus m) => Maybe a -> m a
liftMaybe = maybe mzero return
这比使用 fail
更可取.我只是把它放在某个方便的模块中。
关于haskell - 如何将 Maybe 值注入(inject) MaybeT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8684252/