Good point.

The Note is wrong.

But I don't like an invariant on a data structure about zonkedness: the 
zonkedness of a type can change whenever we fill in a unification variable, 
possibly very far away. (On the other hand, it does make sense for functions to 
talk about zonkedness in preconditions and postconditions, because function 
calls happen at a certain instant of time.)

Instead, I think the invariant is good as it is except for CSpecialPreds. Which 
are special. :)

And, you're right that a CoVar should never have a type of Concrete# blah. Find 
that code and kill it.

Does this help?

Richard

> On Dec 8, 2021, at 2:40 PM, Alexis King <lexi.lam...@gmail.com> wrote:
> 
> Hi all,
> 
> After a recent off-list conversation, I’ve been exploring using the new 
> SpecialPred mechanism to implement a custom constraint, but I’ve run into 
> some questions regarding evidence for CSpecialCan constraints. Specifically, 
> I’m uncertain about how to use them while satisfying Note [CtEvidence 
> invariants] in GHC.Tc.Types.Constraint.
> 
> Specifically, the Note in question states that ctev_pred must always be kept 
> in sync with the type of the evidence. For example, if ctev_dest for a wanted 
> constraint is a coercion hole, ctev_pred must be `varType (coHoleCoVar 
> hole)`. However, this seems rather odd in the case of Concrete# constraints, 
> since the evidence for a `Concrete# (ty :: ki)` constraint is a coercion of 
> type `ty ~# alpha`.
> 
> In canNonDecomposableConcretePrim in GHC.Tc.Solver.Canonical, setCtEvPredType 
> is used to update the type of a CSpecialCan constraint, and setCtEvPredType 
> automatically maintains the CtEvidence invariant mentioned above. But this 
> results in setCoHoleType being used to modify the type of the CoVar from `ty 
> ~# alpha` to `Concrete# (ty :: ki)`, which does not make much sense, since 
> that is definitely not the type of the CoVar. As far as I can tell, the only 
> reason that doesn’t cause Core Lint errors is that the modified CoVar is 
> never actually used, only the original one is.
> 
> This suggests to me that the invariant is not actually the right one. The 
> Note suggests that the reason the invariant exists is that the type must be 
> kept fully-zonked… which in turn suggests that perhaps fully-zonkedness is 
> the invariant that’s actually desired. In that case, ctev_pred would not 
> necessarily always be a cache for the type of the evidence, since in the case 
> of Concrete#, the evidence has a different type (though for other types of 
> constraints the old invariant would still coincidentally hold). Rather, it 
> would be the responsibility of canNonDecomposableConcretePrim to merely 
> ensure the evidence’s type is appropriately zonked.
> 
> Does this all sound right to people? If so, I will update the Note with the 
> modified invariant and update the code to match.
> 
> Alexis

_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to