haskell - 如何将 Maybe 值注入(inject) MaybeT

标签 haskell monad-transformers

说我有一些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/

相关文章:

haskell - 如何为 Haskell 实例赋予具体值?

haskell - 泛型系列生成无限列表

Haskell 学习环境

haskell - 将 failWith 与 Servant 和自定义 monad 堆栈一起使用

haskell - 在 Haskell 中减少单子(monad)

performance - 泛化 monad 时,性能下降近 50%

haskell - 在 Haskell 中计算 md5 摘要最便宜的方法是什么?

haskell - 如何在 Haskell 中导出组合类型

haskell - 从分类的角度看,Haskell 的 monad 转换器是什么?

haskell - 约束 : MonadError Failure m 中的非类型变量参数