[GHC] #9117: Coercible constraint solver misses one

GHC ghc-devs at haskell.org
Mon May 19 16:07:38 UTC 2014


#9117: Coercible constraint solver misses one
-------------------------------------+------------------------------------
        Reporter:  goldfire          |            Owner:  nomeata
            Type:  bug               |           Status:  new
        Priority:  normal            |        Milestone:
       Component:  Compiler          |          Version:  7.8.2
      Resolution:                    |         Keywords:
Operating System:  Unknown/Multiple  |     Architecture:  Unknown/Multiple
 Type of failure:  None/Unknown      |       Difficulty:  Unknown
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+------------------------------------

Comment (by goldfire):

 Replying to [comment:10 simonpj]:
 > The only reason for giving a role signature that is less permissive than
 the actual newtype-unwrapping is, well, to be more restrictive.  So I
 think it'd be rather unusual both to give a role signature, and to expose
 the data constructor of the newtype.  So I'm not too bothered about this
 particular dead end.

 Actually, fixing this adds a nice feature to this whole area: the ability
 to have free conversions within a library but not to export this
 capability! If we have a newtype with a nominal role annotation, its
 constructor might be visible only among "friendly" modules, allowing the
 free conversion. Then, outside of the package, the constructor is
 inaccessible, so no conversions are possible. This ability was a
 desideratum at the beginning of the design process that we thought we
 threw away when we went with the idea of using class instances. But, now
 we have it back!

 > But still, yes, putting the rules in the other order would be a good
 idea.  (Make sure you add a `Note`!)  I'm a bit bugged that `Coercible (N
 Age) (N Int)` might take a rather long way round (unwrapping multiple
 layers of newtype) rather than the short cut (try `(Coercible Age Int)`).
 But maybe I should not worry about that.

 You shouldn't worry about that. :) I conjecture that coercion optimization
 ''already'' fixes this problem. (See uses of `matchAxiom` in
 !OptCoercion.)

 >
 > As to the "knowing more later" stuff, I'm just referring to situations
 like `(alpha t1) ~ (alpha t2)` where `alpha` is a unification variable.
 As constraint solving progresses we may learn what `alpha` is -- but if we
 have already decomposed the application it may now be too late.  It's
 difficult to use the approach that Richard describes, because it interacts
 with all the other constraint solving that is going on during type
 inference.

 Ah. Good point. I hadn't thought of it that way. You're right -- we need
 to be careful here. But, if #9123 gets solved in the way that we're
 thinking of solving it now, we will want the functionality originally
 requested in this ticket available. So, it may be worth doing some Hard
 Thinking about this and getting it right.

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


More information about the ghc-tickets mailing list