30

いくつか持っていfoo :: Maybe Intて、たとえば でバインドしたいとしbar :: Int -> MaybeT (Writer String) Intます。それを行う慣用的な方法は何でしょうか?

独自のliftMaybe関数を定義して、次のように使用できます。

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

しかし、それを行うためのより慣用的な(または少なくとも簡潔な)方法はありますか?

4

1 に答える 1

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

標準的な名前がないのは残念だと思いますが、フーグル検索を行うと、reludeパッケージが次を使用していることがわかりますhoistMaybe

hoistMaybe :: Applicative m => Maybe a -> MaybeT m a

より一般的な形式は

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

これは を使用するよりも望ましい方法ですfail。どこか便利なモジュールに入れるだけです。

于 2011-12-30T21:29:04.160 に答える