Add Control.Monad.forM and forM_
authorDon Stewart <dons@cse.unsw.edu.au>
Thu, 24 Aug 2006 08:11:18 +0000 (08:11 +0000)
committerDon Stewart <dons@cse.unsw.edu.au>
Thu, 24 Aug 2006 08:11:18 +0000 (08:11 +0000)
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

index 721c445..bb1ca98 100644 (file)
@@ -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