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
, mapM -- :: (Monad m) => (a -> m b) -> [a] -> m [b]
, mapM_ -- :: (Monad m) => (a -> m b) -> [a] -> m ()
, 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
, sequence -- :: (Monad m) => [m a] -> m [a]
, sequence_ -- :: (Monad m) => [m a] -> m ()
, (=<<) -- :: (Monad m) => (a -> m b) -> m a -> m b
mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
{-# INLINE mapM_ #-}
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__ */
-- -----------------------------------------------------------------------------
#endif /* __GLASGOW_HASKELL__ */
-- -----------------------------------------------------------------------------
ys <- filterM p xs
return (if flg then x:ys else ys)
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
-- | This generalizes the list-based 'concat' function.
msum :: MonadPlus m => [m a] -> m a