[GHC] #8095: TypeFamilies painfully slow

GHC ghc-devs at haskell.org
Tue Oct 6 14:26:03 UTC 2015


#8095: TypeFamilies painfully slow
-------------------------------------+-------------------------------------
        Reporter:  MikeIzbicki       |                Owner:  bgamari
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:  8.0.1
       Component:  Compiler (Type    |              Version:  7.6.3
  checker)                           |
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  5321              |  Differential Rev(s):
-------------------------------------+-------------------------------------

Comment (by goldfire):

 It has to get big, as the coercion witnesses the sequence of reductions
 that a type family makes to get to a normal form. There are roughly `N`
 steps. And each step must explicitly mention the decreasing value of `N`.
 And that's quadratic.

 Unless I'm missing something, the only way to remove the quadratic
 behavior here is to redesign Core to be less explicit. That might just be
 possible.

 Right now, we can take a coercion and ask what types it relates. We will
 always get an answer. But perhaps we can redesign things so that we ask a
 coercion what types it relates, '''and we always provide one of the
 types'''. Then some function tells us what the other type is. (This
 operation can't just be, say, left-to-right because we need `sym` to
 work.) As a really easy example, this new design means that reflexive
 coercions don't need to store their types, because one type is always the
 same as the other. In the case of axioms, getting from one type to another
 is much harder. Going left-to-right seems possible, but it will require a
 matching algorithm. Going right-to-left on non-injective type family
 axioms is not possible without some extra information, so that's annoying.
 But maybe there's a design of this feature available.

 What would be the consequences? Coercions would get smaller. Compilation
 would get faster. Core Lint would get slower. Core would get harder to
 debug, perhaps. Might be worth it.

 '''Wait! A new idea! '''

 This is actually an old idea of mine, but one I've never articulated. What
 if we just don't bother with coercions at all when `-dcore-lint` is off? I
 conjecture that they're entirely pointless without `-dcore-lint`.
 Sometimes we'll need to ask for the type of `(expr |> co)`, and so we'll
 have to store the type of the result of a cast (since we're omitting the
 coercion). Implementing this idea may be a challenge given our current
 code infrastructure, but I do think it would work. And then, poof, this
 problem goes away, and compilation probably gets a lot faster in a lot of
 cases. We absolutely want to keep coercions around for `-dcore-lint`, as
 that feature has saved us from unknown quantities of pain and
 embarrassment. But there's no good reason ordinary, trusting users need to
 pay the price (in compilation times/memory) for this feature.

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


More information about the ghc-tickets mailing list