假设我有一些foo :: Maybe Int
并且我希望将其绑定到例如bar :: Int -> MaybeT (Writer String) Int
,那么这样做的惯用方法是什么?
我可以定义自己的liftMaybe
函数,然后使用它,如:
let liftMaybe = maybe (fail "Nothing") return in liftMaybe foo >>= bar
但是,有没有更惯用(或至少简洁)的方法呢?
答案 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
虽然显而易见,却没有出现。