如何将一个Maybe值注入到MaybeT中

29

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

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

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

但是否有更惯用(或至少更简洁)的方法来实现这一点?

1个回答

27
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 更可取。


谢谢,这已经是一个进步了。但我们能做得更好吗? - user1078763
也许 maybe mzero return 吗?我表示怀疑;已经非常简短了。我不建议你在每个使用它的地方都插入它;把它放到一个共用的模块中是一个更好的选择。 - ehird
1
实际上是“t n a”。唉,这就是为什么我需要一个类型检查器。 - C. A. McCann
我认为有趣的是,Hayoo 对于 Maybe a -> m a 的搜索结果比 Hoogle 更相关(至少对我来说是个惊喜)。 - user1078763
2
errors 包将其命名为 hoistMaybe:https://hackage.haskell.org/package/errors-1.4.7/docs/Control-Error-Util.html - Emmanuel Touzery
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接