[GHC] #15009: Float equalities past local equalities

GHC ghc-devs at haskell.org
Sun Sep 23 18:29:08 UTC 2018


#15009: Float equalities past local equalities
-------------------------------------+-------------------------------------
        Reporter:  goldfire          |                Owner:  (none)
            Type:  feature request   |               Status:  closed
        Priority:  normal            |            Milestone:  8.4.3
       Component:  Compiler          |              Version:  8.2.2
      Resolution:  fixed             |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:  gadt/T15009
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by nfrisby):

 Replying to [comment:11 simonpj]:
 > I think you are referring to `Note [Let-bound skolems]` in `TcSMonad`?

 Yep, that's the most relevant Note.

 > ...

 Snipped. (Should it have been "When doing inference on {{{h}}} we'll
 assign {{{z :: alpha[1]}}}"? Since {{{y}}} is already "declared" {{{::
 a}}} from the {{{g}}} signature.)

 > Does that help explain? I could add this to the Note.

 Yes, that explanation does help. I'm ruminating now about how it compares
 to the main jfp-OutsideIn narrative eg so I can better suggest how to
 update the Note.

 Beyond the Note, though, my comment above was asking how feasible it is
 for the following example to work. My intuition (which I'm working to
 unpack) thinks it should. But 1) am I wrong? and 2) how much work to have
 GHC accept it?

 {{{
 data S a where MkS :: (a ~ Int) => S a   -- from your 2nd example

 data Query f b = MkQuery (forall q. f q -> q -> b)   -- a new ingredient

 g3 :: Query S Int   -- GHC 8.6 cannot infer this type. Should a later GHC?
 g3 = MkQuery (\MkS x -> x)
 }}}

 I'm trying to decode my intuition for what exactly is it about {{{g3}}}
 (contrasted with your {{{g}}}) that should justify unifying{{{beta :=
 Int}}} in this case. For example, if we define {{{QueryS}}} as a manual
 specialization of {{{Query}}} with {{{f = S}}}, then your previous commit
 for this ticket works for {{{g2}}} below.

 {{{
 data QueryS b where MkQueryS :: (a ~ Int) => (a -> b) -> QueryS b

 to :: Query S b -> QueryS b
 to (MkQuery f) = MkQueryS (f MkS)
 from :: QueryS b -> Query S b
 from (MkQueryS f) = MkQuery (\MkS -> f)

 g2 = MkQueryS (\x -> x)   -- GHC 8.6 infers QueryS Int
 }}}

 This isomorphism and inference for {{{g2}}} reassures me that my hope for
 {{{g3}}} is at least within the realm of possibility.

 In {{{g3}}} there is nothing between the implicit type lambda binding
 {{{q}}} and the pattern match on {{{MkS}}}. So I think we end up with
 nested implications with nothing in between. (I'm very doubtful that I
 have the level numbers correct here.)

 {{{
 forall[2] a. -- from the type lambda
   forall[3] . (a ~ Int) =>  -- from the MkS pattern
     (a ~ alpha[2],a ~ beta[1])
 }}}

 Perhaps my optimistic intuition for {{{g3}}} is because the outer
 implication here is so trivial: {{{alpha}}} and {{{beta}}} do not occur in
 (any other equality-like constraints in) any siblings of our inner
 implication, so floating {{{alpha ~ beta}}} wouldn't have any
 consequences. Is that suggestive of some refinement to eg
 {{{getNoGivenEqs}}} or am I lost in the weeds? Thank you for your
 patience. -Nick

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


More information about the ghc-tickets mailing list