[GHC] #8851: Standalone deriving and GND behave differently

GHC ghc-devs at haskell.org
Fri Mar 7 05:56:54 UTC 2014


#8851: Standalone deriving and GND behave differently
--------------------------------------------+------------------------------
        Reporter:  simonpj                  |            Owner:  goldfire
            Type:  bug                      |           Status:  new
        Priority:  normal                   |        Milestone:
       Component:  Compiler (Type checker)  |          Version:  7.8.1-rc1
      Resolution:                           |         Keywords:
Operating System:  Unknown/Multiple         |     Architecture:
 Type of failure:  None/Unknown             |  Unknown/Multiple
       Test Case:                           |       Difficulty:  Unknown
        Blocking:                           |       Blocked By:
                                            |  Related Tickets:
--------------------------------------------+------------------------------

Comment (by goldfire):

 I agree fully with Simon's analysis.

 But, the solution to this problem gets involved with areas of GHC that I'm
 not terribly familiar with, and I need some guidance before proceeding.

 The interesting bit is `simplifyDeriv` in !TcDeriv, which has this chunk:

 {{{
        ; wanted <- mapM (\(PredOrigin t o) -> newFlatWanted o (substTy
 skol_subst t)) theta

        ; (residual_wanted, _ev_binds1)
              <- solveWantedsTcM (mkFlatWC wanted)
 }}}

 I can understand quite clearly what this is doing. It's creating a new
 `wanted` constraint for each (skolemised) predicate in `theta`. Then, we
 throw the set of wanteds into the constraint solver and see what comes
 out. Processing that happens below here figures out if `residual_wanted`
 indicates success or failure.

 The problem is that we now wish to do all of the above with some
 assumptions. My first thought was to create an implication constraint for
 this, but it's not clear to me the right way to set it up. I found
 `checkConstraints`, which seems quite relevant, but I'm not sure what to
 pass for its `thing_inside`. Change the `newFlatWanted` to something that
 ''emits'' the wanteds? Then, what do I pass to `solveWantedsTcM`? Do I
 really want `solveWantedsTcMWithEvBinds`? But, that functions takes an
 `EvBindsVar`, and `checkConstraints` gives me a `TcEvBinds`, which may or
 may not contain the `EvBindsVar`. (I believe that, in this case, it
 ''will'' always contain the `EvBindsVar`, but this seems like a silly
 thing to rely on.)

 In any case, I'm not sure which lever will drive the ship to safety and
 which knob will sink the whole lot. Any advice is appreciated, or if
 you're short of time, you're welcome to yank this bug from me and fix it
 yourself. In any case, I will need to learn about these interactions quite
 soon in other work, so the timing is perfect. Thanks!

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


More information about the ghc-tickets mailing list