Make Data.List.concatMap fuse better
authorDavid Feuer <David.Feuer@gmail.com>
Tue, 21 Oct 2014 20:02:03 +0000 (15:02 -0500)
committerAustin Seipp <austin@well-typed.com>
Tue, 21 Oct 2014 20:02:03 +0000 (15:02 -0500)
Summary:
Fix #9537 precisely as Joachim Breitner proposed in
http://www.haskell.org/pipermail/haskell-cafe/2011-December/097228.html

Reviewers: austin, nomeata

Reviewed By: austin, nomeata

Subscribers: thomie, carter, ezyang, simonmar

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

GHC Trac Issues: #9537

libraries/base/GHC/List.lhs

index 7792eed..2d01678 100644 (file)
@@ -717,6 +717,14 @@ lookup  key ((x,y):xys)
 concatMap               :: (a -> [b]) -> [a] -> [b]
 concatMap f             =  foldr ((++) . f) []
 
+{-# NOINLINE [1] concatMap #-}
+
+{-# RULES
+"concatMap" forall f xs . concatMap f xs =
+    build (\c n -> foldr (\x b -> foldr c b (f x)) n xs)
+ #-}
+
+
 -- | Concatenate a list of lists.
 concat :: [[a]] -> [a]
 concat = foldr (++) []