Advice for implementing GADTs?

Simon Peyton Jones simon.peytonjones at gmail.com
Tue Aug 16 08:47:06 UTC 2022


>
> 3.1: OK, so if the case branch introduces type-class constraints, but not
> equality constraints, then the unification variables from an outer level
> are still touchable?  Presumably because the type-class constraints don't
> interact with the equality constraints?
>

Yes, but the check is a bit conservative. Look at `inert_given_eqs` in
`InertCans`, and `updateGivenEqs`.

* implication constraints like (a ~ Int ==> a ~ Int) are never created.
>
I may be assuming that GHC runs the solver for each GADT pattern match
> before creating implication constraints.
>
That's not right.  They can be created, but then get solved, by solving the
Wanted from the Given.

3.3: Also, is there a standard way to pretty-print implication
> constraints?  The OutsideIn paper uses LaTeX \supset I think, but there
> isn't an obvious ASCII character to use to for \supset...
>

Well there is a `Outputable` instance.  It uses `=>`.

Simon

On Mon, 15 Aug 2022 at 20:00, Benjamin Redelings <
benjamin.redelings at gmail.com> wrote:

> Thanks a bunch for this!
> On 8/4/22 3:45 PM, Simon Peyton Jones wrote:
>
> QUESTION 1: Are there any obviously important resources that I've
> overlooked?
> That's a good list.  Ningning's thesis https://xnning.github.io/ is also
> good stuff.
>
> Thanks!
>
>
> QUESTION 2: if my quick scan is correct, none of the papers mention the
> GHC technique of determining untouchability by assigning "levels" to type
> variables.  Is there any written paper (outside the GHC sources) that
> discusses type levels?
> It is disgracefully undocumented, I'm afraid.  Sorry.  Didier Remy used
> similar ideas, in some INRIA papers I think.
>
> OK, that was my impression, just checking.  I think I get the basic idea...
>
>
> QUESTION 3: My impression is that:
>
> (a) type variable levels were introduced in order to clarify which
> MetaTyVars are "untouchable", but
>
> (b) levels now also check that type variables do not escape their
> quantification scope.
>
> (c) levels can also be used to figure out which variables are free in the
> type environment, and therefore should not be generalized over.
>
> Does this sound right?  I suspect that I might be wrong about the last
> one...
>
>
> Correct about all three.
>
> Good to know!
>
> Except that a unification variable is only untouchable if it comes from an
> outer level *and* there are some intervening Given equalities.   If there
> are no equalities it's not untouchable.  E.b.
>    f = \x -> case x of
> Just y -> 3::Int
>
> Here the (3::Int) can affect the result type of the function because the
> Just pattern match does not bind any Given equalities (in a GADT like way).
>
> 3.1: OK, so if the case branch introduces type-class constraints, but not
> equality constraints, then the unification variables from an outer level
> are still touchable?  Presumably because the type-class constraints don't
> interact with the equality constraints?
>
> 3.2: The OutsideIn paper talks about creating implication constraints,
> which then bubble UP to the level where the solver is applied.  Maybe only
> at the outermost level?
>
> However, it sounds like GHC pushes given constraints from a GADT pattern
> match DOWN into the case branch.  Implication constraints would only be
> created if the wanted constraints bubble up to a GADT pattern match, and
> are not entailed by the givens.  So
>
> * implication constraints like (a ~ Int ==> a ~ Int) are never created.
>
> * however, implication constraints like (a ~ Int ==> b ~ Int) could be
> created.
>
> I may be assuming that GHC runs the solver for each GADT pattern match
> before creating implication constraints.
>
> Does that sound right?
>
> 3.3: Also, is there a standard way to pretty-print implication
> constraints?  The OutsideIn paper uses LaTeX \supset I think, but there
> isn't an obvious ASCII character to use to for \supset...
>
>
> I keep meaning to write an updated version of Practical type inference
> for arbitrary rank types
> <https://www.microsoft.com/en-us/research/publication/practical-type-inference-for-arbitrary-rank-types/>,
> but failing to get around to it!
>
> That would be great, if you find the time!  Are you thinking of adding
> practical steps for handling equality constraints to it?  Or, removing the
> deep-subsumption language?  Or something else?  It has already been quite
> helpful.
>
> -BenRI
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20220816/12264612/attachment.html>


More information about the ghc-devs mailing list