X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Control%2FMonad.hs;h=2bbfc5714c79045e312f95be4fd5d5058999ca1a;hb=41e8fba828acbae1751628af50849f5352b27873;hp=7d43db941bbcd4ba998a874f22d26b3ffab20a9f;hpb=95551d95988646a16ed4550f403ee4c27884a292;p=ghc-base.git diff --git a/Control/Monad.hs b/Control/Monad.hs index 7d43db9..2bbfc57 100644 --- a/Control/Monad.hs +++ b/Control/Monad.hs @@ -1,4 +1,5 @@ -{-# OPTIONS_GHC -XNoImplicitPrelude #-} +{-# LANGUAGE CPP, NoImplicitPrelude #-} + ----------------------------------------------------------------------------- -- | -- Module : Control.Monad @@ -46,6 +47,7 @@ module Control.Monad , join -- :: (Monad m) => m (m a) -> m a , msum -- :: (MonadPlus m) => [m a] -> m a + , mfilter -- :: (MonadPlus m) => (a -> Bool) -> m a -> m a , filterM -- :: (Monad m) => (a -> m Bool) -> [a] -> m [a] , mapAndUnzipM -- :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c]) , zipWithM -- :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c] @@ -127,8 +129,6 @@ class Monad m => MonadPlus m where -- > mzero >>= f = mzero -- > v >> mzero = mzero -- - -- (but the instance for 'System.IO.IO' defined in Control.Monad.Error - -- in the mtl package does not satisfy the second one). mzero :: m a -- | an associative operation mplus :: m a -> m a -> m a @@ -224,7 +224,7 @@ the list arguments. This could be an issue where @('>>')@ and the `folded function' are not commutative. -> foldM f a1 [x1, x2, ..., xm ] +> foldM f a1 [x1, x2, ..., xm] == @@ -313,6 +313,20 @@ ap :: (Monad m) => m (a -> b) -> m a -> m b ap = liftM2 id +-- ----------------------------------------------------------------------------- +-- Other MonadPlus functions + +-- | Direct 'MonadPlus' equivalent of 'filter' +-- @'filter'@ = @(mfilter:: (a -> Bool) -> [a] -> [a]@ +-- applicable to any 'MonadPlus', for example +-- @mfilter odd (Just 1) == Just 1@ +-- @mfilter odd (Just 2) == Nothing@ + +mfilter :: (MonadPlus m) => (a -> Bool) -> m a -> m a +mfilter p ma = do + a <- ma + if p a then return a else mzero + {- $naming The functions in this library use the following naming conventions: