From b5dd194466259e21a422af356f8d2e83bfd85a09 Mon Sep 17 00:00:00 2001 From: Don Stewart Date: Thu, 24 Aug 2006 08:11:18 +0000 Subject: [PATCH] Add Control.Monad.forM and forM_ flip mapM_ is more and more common, I find. Several suggestions have been made to add this, as foreach or something similar. This patch does just that: forM :: (Monad m) => [a] -> (a -> m b) -> m [b] forM_ :: (Monad m) => [a] -> (a -> m b) -> m () So we can write: Prelude Control.Monad> forM_ [1..4] $ \x -> print x 1 2 3 4 --- Control/Monad.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Control/Monad.hs b/Control/Monad.hs index 721c445..bb1ca98 100644 --- a/Control/Monad.hs +++ b/Control/Monad.hs @@ -32,6 +32,8 @@ module Control.Monad , mapM -- :: (Monad m) => (a -> m b) -> [a] -> m [b] , mapM_ -- :: (Monad m) => (a -> m b) -> [a] -> m () + , forM -- :: (Monad m) => [a] -> (a -> m b) -> m [b] + , forM_ -- :: (Monad m) => [a] -> (a -> m b) -> m () , sequence -- :: (Monad m) => [m a] -> m [a] , sequence_ -- :: (Monad m) => [m a] -> m () , (=<<) -- :: (Monad m) => (a -> m b) -> m a -> m b @@ -108,6 +110,7 @@ mapM f as = sequence (map f as) mapM_ :: Monad m => (a -> m b) -> [a] -> m () {-# INLINE mapM_ #-} mapM_ f as = sequence_ (map f as) + #endif /* __GLASGOW_HASKELL__ */ -- ----------------------------------------------------------------------------- @@ -154,6 +157,16 @@ filterM p (x:xs) = do ys <- filterM p xs return (if flg then x:ys else ys) +-- | @'forM' f@ is @'mapM'@ with its arguments flipped +forM :: Monad m => [a] -> (a -> m b) -> m [b] +{-# INLINE forM #-} +forM = flip mapM + +-- | @'forM_' f@ is @'mapM_'@ with its arguments flipped +forM_ :: Monad m => [a] -> (a -> m b) -> m () +{-# INLINE forM_ #-} +forM_ = flip mapM_ + -- | This generalizes the list-based 'concat' function. msum :: MonadPlus m => [m a] -> m a -- 1.7.10.4