Note [The ZonkEnv]
* ze_flexi :: ZonkFlexi says what to do with a unification variable that is still un-unified. See Note [Un-unified unification variables] * ze_tv_env :: TyCoVarEnv TyCoVar promotes sharing. At a binding site of a tyvar or covar, we zonk the kind right away and add a mapping to the env. This prevents re-zonking the kind at every occurrence. But this is *just* an optimisation. * ze_id_env : IdEnv Id promotes sharing among Ids, by making all occurrences of the Id point to a single zonked copy, built at the binding site. Unlike ze_tv_env, it is knot-tied: see extendIdZonkEnvRec. In a mutually recursive group rec { f = ...g...; g = ...f... } we want the occurrence of g to point to the one zonked Id for g, and the same for f. Because it is knot-tied, we must be careful to consult it lazily. * ze_meta_tv_env: see Note [Sharing when zonking to Type] Notes: * We must be careful never to put coercion variables (which are Ids, after all) in the knot-tied ze_id_env, because coercions can appear in types, and we sometimes inspect a zonked type in the GHC.Tc.Zonk.Type module. [Question: where, precisely?] * An obvious suggestion would be to have one VarEnv Var to replace both ze_id_env and ze_tv_env, but that doesn't work because of the knot-tying stuff mentioned above.
References 2
- Un-unified unification variables GHC.Tc.Zonk.Env
- Sharing when zonking to Type GHC.Tc.Zonk.Type
Referenced by 4
- Module structure for zonking GHC.Tc.Zonk.Type ×2
- GHC.Tc.Zonk.Env call site
- What is zonking? GHC.Tc.Zonk.Type