Add rule mapFB c (λx.x) = c
authorJoachim Breitner <mail@joachim-breitner.de>
Mon, 6 Mar 2017 22:30:52 +0000 (17:30 -0500)
committerBen Gamari <ben@smart-cactus.org>
Mon, 6 Mar 2017 23:51:03 +0000 (18:51 -0500)
Test Plan: exended T2110 with a case for that.

Reviewers: austin, hvr, dfeuer, bgamari

Reviewed By: dfeuer

Subscribers: dfeuer, thomie

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

libraries/base/GHC/Base.hs
testsuite/tests/simplCore/should_run/T2110.hs
testsuite/tests/simplCore/should_run/T2110.stdout

index 2f155c6..6f9d454 100644 (file)
@@ -973,6 +973,7 @@ mapFB c f = \x ys -> c (f x) ys
 "map"       [~1] forall f xs.   map f xs                = build (\c n -> foldr (mapFB c f) n xs)
 "mapList"   [1]  forall f.      foldr (mapFB (:) f) []  = map f
 "mapFB"     forall c f g.       mapFB (mapFB c f) g     = mapFB c (f.g)
+"mapFB/id"  forall c.           mapFB c (\x -> x)       = c
   #-}
 
 -- See Breitner, Eisenberg, Peyton Jones, and Weirich, "Safe Zero-cost
index 610be09..d945fac 100644 (file)
@@ -5,6 +5,8 @@ import Unsafe.Coerce
 
 newtype Age = Age Int
 
+foo :: [Int] -> [Int]
+foo = map id
 fooAge :: [Int] -> [Age]
 fooAge = map Age
 fooCoerce :: [Int] -> [Age]
@@ -19,6 +21,7 @@ same x y = case reallyUnsafePtrEquality# (unsafeCoerce x) y of
 
 main = do
     let l = [1,2,3]
+    same (foo l) l
     same (fooAge l) l
     same (fooCoerce l) l
     same (fooUnsafeCoerce l) l