假设我有一个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
更可取。
maybe mzero return
吗?我表示怀疑;已经非常简短了。我不建议你在每个使用它的地方都插入它;把它放到一个共用的模块中是一个更好的选择。 - ehirdMaybe a -> m a
的搜索结果比 Hoogle 更相关(至少对我来说是个惊喜)。 - user1078763errors
包将其命名为hoistMaybe
:https://hackage.haskell.org/package/errors-1.4.7/docs/Control-Error-Util.html - Emmanuel Touzery