data TcTyVarDetails
= SkolemTv SkolemInfo -- A skolem constant
- | FlatSkol TcType -- The "skolem" obtained by flattening during
- -- constraint simplification
+ | FlatSkol TcType
+ -- The "skolem" obtained by flattening during
+ -- constraint simplification
- -- In comments we will use the notation alpha[flat = ty]
- -- to represent a flattening skolem variable alpha
- -- identified with type ty.
-
+ -- In comments we will use the notation alpha[flat = ty]
+ -- to represent a flattening skolem variable alpha
+ -- identified with type ty.
+
| MetaTv MetaInfo (IORef MetaDetails)
data MetaDetails
- = Flexi -- Flexi type variables unify to become Indirects
+ = Flexi -- Flexi type variables unify to become Indirects
| Indirect TcType
data MetaInfo
-- The Name is the name of the function from whose
-- type signature we got this skolem
+ | TcsTv -- A MetaTv allocated by the constraint solver
+ -- Its particular property is that it is always "touchable"
+ -- Nevertheless, the constraint solver has to try to guess
+ -- what type to instantiate it to
+
----------------------------------
-- SkolemInfo describes a site where
-- a) type variables are skolemised
pprTcTyVarDetails :: TcTyVarDetails -> SDoc
-- For debugging
pprTcTyVarDetails (SkolemTv _) = ptext (sLit "sk")
-pprTcTyVarDetails (FlatSkol _) = ptext (sLit "fsk")
+pprTcTyVarDetails (FlatSkol {}) = ptext (sLit "fsk")
pprTcTyVarDetails (MetaTv TauTv _) = ptext (sLit "tau")
+pprTcTyVarDetails (MetaTv TcsTv _) = ptext (sLit "tcs")
pprTcTyVarDetails (MetaTv (SigTv _) _) = ptext (sLit "sig")
pprUserTypeCtxt :: UserTypeCtxt -> SDoc
quotes (ppr tv) <+> ppr_details (tcTyVarDetails tv)
where
ppr_details (SkolemTv info) = ppr_skol info
- ppr_details (FlatSkol _) = ptext (sLit "is a flattening type variable")
- ppr_details (MetaTv TauTv _) = ptext (sLit "is a meta type variable")
- ppr_details (MetaTv (SigTv n) _) = ptext (sLit "is bound by the type signature for") <+> quotes (ppr n)
+ ppr_details (FlatSkol {}) = ptext (sLit "is a flattening type variable")
+ ppr_details (MetaTv (SigTv n) _) = ptext (sLit "is bound by the type signature for")
+ <+> quotes (ppr n)
+ ppr_details (MetaTv _ _) = ptext (sLit "is a meta type variable")
ppr_skol UnkSkol = ptext (sLit "is an unknown type variable") -- Unhelpful
ppr_skol RuntimeUnkSkol = ptext (sLit "is an unknown runtime type")
-- not a SigTv
= ASSERT( isTcTyVar tv)
case tcTyVarDetails tv of
- MetaTv TauTv _ -> True
- _ -> False
+ MetaTv (SigTv _) _ -> False
+ _ -> True
isSkolemTyVar tv
= ASSERT2( isTcTyVar tv, ppr tv )