30

假设我有一些foo :: Maybe Int并且我想将它与例如绑定bar :: Int -> MaybeT (Writer String) Int,那么惯用的方法是什么?

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

let liftMaybe = maybe (fail "Nothing") return in liftMaybe foo >>= bar

但是有没有更惯用(或至少简洁)的方式来做到这一点?

4

1 回答 1

28
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. 我只是把它放在某个方便的模块中。

于 2011-12-30T21:29:04.160 回答