[GHC] #9318: Type error reported in wrong place with repeated type family expressions

GHC ghc-devs at haskell.org
Tue Jul 15 23:28:20 UTC 2014


#9318: Type error reported in wrong place with repeated type family expressions
-------------------------------------+-------------------------------------
              Reporter:  goldfire    |             Owner:  simonpj
                  Type:  bug         |            Status:  new
              Priority:  high        |         Milestone:  7.10.1
             Component:  Compiler    |           Version:  7.8.3
  (Type checker)                     |          Keywords:
            Resolution:              |  Operating System:  Unknown/Multiple
Differential Revisions:              |   Type of failure:  None/Unknown
          Architecture:              |         Test Case:
  Unknown/Multiple                   |          Blocking:
            Difficulty:  Unknown     |
            Blocked By:              |
       Related Tickets:              |
-------------------------------------+-------------------------------------
Changes (by simonpj):

 * cc: dimitris@… (added)
 * owner:   => simonpj
 * priority:  normal => high
 * milestone:   => 7.10.1


Comment:

 Dimitrios, I'd like to discuss this with you when you get back.

 The behaviour is terrible, and it's a classic case of rewriting a wanted
 with a wanted.  We have
 {{{
 [W] w1 :: F Int ~ Bool   -- From foo
 [W] w2 :: F Int ~ Char   -- From bar
 }}}
 We try to solve `w2` first:
  * we rewrite the `F Int` to `Bool`,
  * add `w2` to the `inert_solved_funeqs`
  * make `w3` :: Bool ~ Char`  (insoluble, correctly)
  * bind `w2` to evidence involving `w3` and the axiom

 But now when we try to solve `w1` we find `w2` in the
 `inert_solved_funeqs` before looking up in the axioms, and thus rewrite to
 `Char ~ Bool`.  Disaster.

 The problem is putting `w2` (which is really insoluble) in the
 `inert_solved_funeqs`.

 Instead I suspect we should put only ''givens'' in the
 `inert_solved_funeqs`, namely the evidence from the use of the axiom.  So
 solving the second goal would go more like this
  * we rewrite the `F Int` to `Bool`, with coercion `co`
  * add `[G] co : F Int ~ Bool` to `inert_solved_funeqs`
  * create `[W] w3 :: Bool ~ Char`
  * bind `w2 = co ; w3`

 Now `inert_solved_funeqs` contains only givens derived directly from
 axioms, which we can safely use to solve anything.

 Simon

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


More information about the ghc-tickets mailing list