-- the context constrains only universally quantified variables
-- MkT :: forall a b. (a ~ b, Ord b) => a -> T a b
dcOtherTheta :: ThetaType, -- The other constraints in the data con's type
- -- *other than* those in the dcEqSpec
+ -- other than those in the dcEqSpec
dcStupidTheta :: ThetaType, -- The context of the data type declaration
-- data Eq a => T a = ...
opt_co' env sym (PredCo cos) = mkPredCo (fmap (opt_co env sym) cos)\r
opt_co' env sym (AppCo co1 co2) = mkAppCo (opt_co env sym co1) (opt_co env sym co2)\r
opt_co' env sym (ForAllCo tv co) = case substTyVarBndr env tv of\r
- (env', tv') -> ForAllCo tv' (opt_co env' sym co)\r
+ (env', tv') -> mkForAllCo tv' (opt_co env' sym co)\r
+ -- Use the "mk" functions to check for nested Refls\r
+\r
opt_co' env sym (CoVarCo cv)\r
| Just co <- lookupCoVar env cv\r
= opt_co (zapCvSubstEnv env) sym co\r
-- can appear as the right hand side of a type synonym.
| FunTy
- Type
+ Type
Type -- ^ Special case of 'TyConApp': @TyConApp FunTyCon [t1, t2]@
+ -- See Note [Equality-constrained types]
| ForAllTy
- TyCoVar -- ^ Type *or* coercion variable; see Note [Equality-constrained types]
+ TyCoVar -- Type variable
Type -- ^ A polymorphic type
| PredTy
is encoded like this:
ForAllTy (a:*) $ ForAllTy (b:*) $
- ForAllTy (wild_co : a ~ [b]) $
+ FunTy (PredTy (EqPred a [b]) $
blah
-That is, the "(a ~ [b]) =>" part is encode as a for-all
-type with a coercion variable that is never mentioned.
-
-We could instead have used a FunTy with an EqPred on the
-left. But we want
-
- * FunTy to mean RUN-TIME abstraction,
- passing a real value at runtime,
-
- * ForAllTy to mean COMPILE-TIME abstraction,
- erased at runtime
-
-------------------------------------
Note [PredTy]