Eta-expand argument to foldr in mapM_ for []
authorDavid Feuer <david.feuer@gmail.com>
Thu, 5 Feb 2015 23:42:50 +0000 (17:42 -0600)
committerAustin Seipp <austin@well-typed.com>
Thu, 5 Feb 2015 23:42:50 +0000 (17:42 -0600)
Summary:
This improves performance, at least sometimes--the previous
implementation can be worse than the version in base 4.7. I
have not had the time to run benchmarks and such, but `mapM`
already does this.

Also, inline `mapM_`, like `mapM`.

Reviewers: hvr, nomeata, ekmett, austin

Reviewed By: ekmett, austin

Subscribers: thomie

Projects: #ghc

Differential Revision: https://phabricator.haskell.org/D632

GHC Trac Issues: #10034

libraries/base/Data/Foldable.hs

index a745f66..b8b0973 100644 (file)
@@ -349,7 +349,8 @@ for_ = flip traverse_
 -- As of base 4.8.0.0, 'mapM_' is just 'traverse_', specialized to
 -- 'Monad'.
 mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()
-mapM_ f= foldr ((>>) . f) (return ())
+{-# INLINE mapM_ #-}
+mapM_ f = foldr (\m n -> f m >> n) (return ())
 
 -- | 'forM_' is 'mapM_' with its arguments flipped. For a version that
 -- doesn't ignore the results see 'Data.Traversable.forM'.