diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,7 @@
 Changelog for Extra
 
+1.4.7
+    #21, add concatForM
 1.4.6
     #11, add maybeM and eitherM
 1.4.5
diff --git a/extra.cabal b/extra.cabal
--- a/extra.cabal
+++ b/extra.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.10
 build-type:         Simple
 name:               extra
-version:            1.4.6
+version:            1.4.7
 license:            BSD3
 license-file:       LICENSE
 category:           Development
diff --git a/src/Control/Monad/Extra.hs b/src/Control/Monad/Extra.hs
--- a/src/Control/Monad/Extra.hs
+++ b/src/Control/Monad/Extra.hs
@@ -12,7 +12,7 @@
     -- * Loops
     loopM, whileM,
     -- * Lists
-    partitionM, concatMapM, mconcatMapM, mapMaybeM, findM, firstJustM,
+    partitionM, concatMapM, concatForM, mconcatMapM, mapMaybeM, findM, firstJustM,
     -- * Booleans
     whenM, unlessM, ifM, notM, (||^), (&&^), orM, andM, anyM, allM
     ) where
@@ -73,7 +73,12 @@
 concatMapM op = foldr f (return [])
     where f x xs = do x <- op x; if null x then xs else do xs <- xs; return $ x++xs
 
--- | A version of 'mconcatMapM' that works with a monadic predicate.
+-- | Like 'concatMapM', but has its arguments flipped, so can be used
+--   instead of the common @fmap concat $ forM@ pattern.
+concatForM :: Monad m => [a] -> (a -> m [b]) -> m [b]
+concatForM = flip concatMapM
+
+-- | A version of 'mconcatMap' that works with a monadic predicate.
 mconcatMapM :: (Monad m, Monoid b) => (a -> m b) -> [a] -> m b
 mconcatMapM f = liftM mconcat . mapM f
 
diff --git a/src/Extra.hs b/src/Extra.hs
--- a/src/Extra.hs
+++ b/src/Extra.hs
@@ -14,7 +14,7 @@
     retry, retryBool, showException, stringException, errorIO, ignore, catch_, handle_, try_, catchJust_, handleJust_, tryJust_, catchBool, handleBool, tryBool,
     -- * Control.Monad.Extra
     -- | Extra functions available in @"Control.Monad.Extra"@.
-    whenJust, whenJustM, unit, maybeM, eitherM, loopM, whileM, partitionM, concatMapM, mconcatMapM, mapMaybeM, findM, firstJustM, whenM, unlessM, ifM, notM, (||^), (&&^), orM, andM, anyM, allM,
+    whenJust, whenJustM, unit, maybeM, eitherM, loopM, whileM, partitionM, concatMapM, concatForM, mconcatMapM, mapMaybeM, findM, firstJustM, whenM, unlessM, ifM, notM, (||^), (&&^), orM, andM, anyM, allM,
     -- * Data.Either.Extra
     -- | Extra functions available in @"Data.Either.Extra"@.
     isLeft, isRight, fromLeft, fromRight, fromEither,
