[GHC] #13353: foldr/nil rule not applied consistently

GHC ghc-devs at haskell.org
Tue Feb 28 19:51:54 UTC 2017


#13353: foldr/nil rule not applied consistently
-------------------------------------+-------------------------------------
           Reporter:  nomeata        |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Compile-time
  Unknown/Multiple                   |  performance bug
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 I just had a project where it made a difference whether I add
 {{{
 {-# RULES "foldr/nil" forall k n . GHC.Base.foldr k n [] = n #-}
 }}}
 to my file or not, despite this rule already being present in the library.

 I tried to minimize the problem and came up with this:
 {{{#!hs
 foo1 (f, fs) (x, xs) = (f x, map ($x) fs ++ map f xs)
 foo2 f fs x xs = (f x, map ($x) fs ++ map f xs)

 test1 x xs = foo1 (id, []) (x, xs)
 test2 x xs = foo2 id [] x xs
 test3 x xs = (id x, map ($x) [] ++ map id xs)
 }}}

 `test2` and `test3` nicely optimize the `map … [] ++` away, but `test`
 does not.

 (In this minimized example, adding the rule again locally does *not* help,
 but there is still something fishy.)

 Also, in all cases, `map id` remains, which should not be the case.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13353>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list