[GHC] #11068: Make Generic/Generic1 methods inlinable

GHC ghc-devs at haskell.org
Mon Nov 9 16:06:06 UTC 2015


#11068: Make Generic/Generic1 methods inlinable
-------------------------------------+-------------------------------------
        Reporter:  glguy             |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  7.10.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):  Phab:D1447
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by glguy):

 Hi Simon,

 The problem I'm working on is indeed related to José's work. I'm solving
 the problem that GHC doesn't use Appliative and Functor laws to rewrite
 code using Haskell instead of rewrite rules. I "run" the code at a lifted
 version of the desired type `f` that uses the Applicative laws to rewrite
 a term to be left associated in the `<*>`s and using a single `<$>`.

 Using this technique allows me to derive efficient code that is generic in
 terms of Functor and Applicative on a case by case basis rather than with
 global rules.

 {{{
 badTraversal :: Traversal' (Int,Int,Int) Int
 badTraversal f (x,y,z) =
   pure (\x' (y',z') -> (x',y',z')) <*> f x <*> ((,) <$> f y <*> f z)

 goodTraversal :: Traversal' (Int,Int,Int) Int
 goodTraversal = boggling badTraversal
 -- generated core is roughly: \f (x,y,z) -> (,,) <$> f x <*> f y <*> f z
 }}}

 The code from `badTraversal` could have been easily generated using
 GHC.Generics, but the efficient version can be recovered using the
 `boggling` operation defined in repository mentioned above.

 As far as my request to add the inline pragma, I think I might have
 misunderstood what GHC was doing. My goal was to ensure that
 from/to/from1/to1 would be able to inline across module boundaries even
 when their definitions were large due to the type being large. However
 after revisiting my test case I was struggling to reproduce that the
 change fixed anything, so I closed the change request (but forgot to
 change this ticket)

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


More information about the ghc-tickets mailing list