[GHC] #8240: Better error messages for type family constraints

GHC ghc-devs at haskell.org
Fri Sep 6 11:14:04 CEST 2013


#8240: Better error messages for type family constraints
------------------------------------+-------------------------------------
       Reporter:  simonpj           |             Owner:
           Type:  bug               |            Status:  new
       Priority:  normal            |         Milestone:
      Component:  Compiler          |           Version:  7.6.3
       Keywords:                    |  Operating System:  Unknown/Multiple
   Architecture:  Unknown/Multiple  |   Type of failure:  None/Unknown
     Difficulty:  Unknown           |         Test Case:
     Blocked By:                    |          Blocking:
Related Tickets:                    |
------------------------------------+-------------------------------------
 Consider this constraint
 {{{
   F Int ~ Bool     -- Arising (say) on line 5
   F Int ~ Char     -- Arising (say) on line 10
 }}}
 At the moment we'll combine the two to
 {{{
   F Int ~ Bool     -- Arising on line 5
   Bool ~ Char      -- Arising on line 10
 }}}
 The second of these errors is "insoluble" and is reported first.  But it's
 totally misleading: nowhere in the program did we directly need
 `Int~Char`.

 Another variant of this came up in Trac #8227. There we get the constraint
 {{{
   Scalar (V a) ~ t0
   Scalar (V a) ~ t0 -> t0
 }}}
 which leads to
 {{{
   Scalar (V a) ~ t0 -> t0
   t0 ~ t0 -> t0   -- Occurs check
 }}}
 which gives the confusing error
 {{{
 T8227.hs:16:44:
     Occurs check: cannot construct the infinite type: t0 ~ t0 -> t0
     Expected type: Scalar (V (t0 -> t0))
       Actual type: Scalar (V a)
 }}}
 I think the solution is

  * Do not combine two Wanteds
 {{{
   [W] F tys ~ t1
   [W] F tys ~ t2
 }}}
   unless t1 and t2 are both touchable unification variables.

  * Instead (perhaps) generate a Derived constraint
 {{{
   [D] t1 ~ t2
 }}}
   to express the fact that t1 and t2 had better end up equal.

  * To do this the inert set would need to contain many `CTyFunEq`
 constraints with the same LHS.

 I'm not very sure about this, and no time now, so I'm just making this
 ticket to record the issue.

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




More information about the ghc-tickets mailing list