如何在MaybeT中注入Maybe值

时间:2011-12-30 21:25:32

标签: haskell monad-transformers

假设我有一些foo :: Maybe Int并且我希望将其绑定到例如bar :: Int -> MaybeT (Writer String) Int,那么这样做的惯用方法是什么?

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

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

但是,有没有更惯用(或至少简洁)的方法呢?

1 个答案:

答案 0 :(得分:22)

MaybeT . return :: (Monad m) => Maybe a -> MaybeT m a

我觉得很遗憾它没有标准名称。更一般的形式是

liftMaybe :: (MonadPlus m) => Maybe a -> m a
liftMaybe = maybe mzero return

,优于使用fail。我只是把它放在一个方便的模块中。

Hayoo为此功能显示wide variety of names;其中,maybeZero是我最喜欢的。 liftMaybe虽然显而易见,却没有出现。