Safe Haskell | None |
---|---|
Language | Haskell2010 |
- data Subst = Subst InScopeSet IdSubstEnv TvSubstEnv CvSubstEnv
- type TvSubstEnv = TyVarEnv Type
- type IdSubstEnv = IdEnv SeqCoreTerm
- data InScopeSet :: *
- deShadowBinds :: [SeqCoreBind] -> [SeqCoreBind]
- substSpec :: Subst -> Id -> SpecInfo -> SpecInfo
- substRulesForImportedIds :: Subst -> [CoreRule] -> [CoreRule]
- substTy :: Subst -> Type -> Type
- substCo :: Subst -> Coercion -> Coercion
- substTerm :: SDoc -> Subst -> SeqCoreTerm -> SeqCoreTerm
- substBind :: Subst -> SeqCoreBind -> (Subst, SeqCoreBind)
- substBindSC :: Subst -> SeqCoreBind -> (Subst, SeqCoreBind)
- substUnfolding :: Subst -> Unfolding -> Unfolding
- substUnfoldingSC :: Subst -> Unfolding -> Unfolding
- lookupIdSubst :: SDoc -> Subst -> Id -> SeqCoreTerm
- lookupTvSubst :: Subst -> TyVar -> Type
- lookupCvSubst :: Subst -> CoVar -> Coercion
- substIdOcc :: Subst -> Id -> Id
- substTickish :: Subst -> Tickish Id -> Tickish Id
- substVarSet :: Subst -> VarSet -> VarSet
- emptySubst :: Subst
- mkEmptySubst :: InScopeSet -> Subst
- mkSubst :: InScopeSet -> TvSubstEnv -> CvSubstEnv -> IdSubstEnv -> Subst
- mkOpenSubst :: InScopeSet -> [(Var, SeqCoreTerm)] -> Subst
- substInScope :: Subst -> InScopeSet
- isEmptySubst :: Subst -> Bool
- extendIdSubst :: Subst -> Id -> SeqCoreTerm -> Subst
- extendIdSubstList :: Subst -> [(Id, SeqCoreTerm)] -> Subst
- extendTvSubst :: Subst -> TyVar -> Type -> Subst
- extendTvSubstList :: Subst -> [(TyVar, Type)] -> Subst
- extendCvSubst :: Subst -> CoVar -> Coercion -> Subst
- extendCvSubstList :: Subst -> [(CoVar, Coercion)] -> Subst
- extendSubst :: Subst -> Var -> SeqCoreTerm -> Subst
- extendSubstList :: Subst -> [(Var, SeqCoreTerm)] -> Subst
- extendSubstWithVar :: Subst -> Var -> Var -> Subst
- zapSubstEnv :: Subst -> Subst
- addInScopeSet :: Subst -> VarSet -> Subst
- extendInScope :: Subst -> Var -> Subst
- extendInScopeList :: Subst -> [Var] -> Subst
- extendInScopeIds :: Subst -> [Id] -> Subst
- isInScope :: Var -> Subst -> Bool
- setInScope :: Subst -> InScopeSet -> Subst
- delBndr :: Subst -> Var -> Subst
- delBndrs :: Subst -> [Var] -> Subst
- substBndr :: Subst -> Var -> (Subst, Var)
- substBndrs :: Subst -> [Var] -> (Subst, [Var])
- substRecBndrs :: Subst -> [Id] -> (Subst, [Id])
- cloneBndr :: Subst -> Unique -> Var -> (Subst, Var)
- cloneBndrs :: Subst -> UniqSupply -> [Var] -> (Subst, [Var])
- cloneIdBndr :: Subst -> UniqSupply -> Id -> (Subst, Id)
- cloneIdBndrs :: Subst -> UniqSupply -> [Id] -> (Subst, [Id])
- cloneRecIdBndrs :: Subst -> UniqSupply -> [Id] -> (Subst, [Id])
Main data types
A substitution environment, containing both Id
and TyVar
substitutions.
Some invariants apply to how you use the substitution:
- The in-scope set contains at least those
Id
s andTyVar
s that will be in scope after applying the substitution to a term. Precisely, the in-scope set must be a superset of the free vars of the substitution range that might possibly clash with locally-bound variables in the thing being substituted in. - You may apply the substitution only once
There are various ways of setting up the in-scope set such that the first of these invariants hold:
- Arrange that the in-scope set really is all the things in scope
- Arrange that it's the free vars of the range of the substitution
- Make it empty, if you know that all the free vars of the substitution are fresh, and hence can't possibly clash
type IdSubstEnv = IdEnv SeqCoreTerm Source
An environment for substituting for Id
s
Substituting into expressions and related types
deShadowBinds :: [SeqCoreBind] -> [SeqCoreBind] Source
De-shadowing the program is sometimes a useful pre-pass. It can be done simply by running over the bindings with an empty substitution, because substitution returns a result that has no-shadowing guaranteed.
(Actually, within a single type there might still be shadowing, because
substTy
is a no-op for the empty substitution, but that's probably OK.)
- Aug 09
- This function is not used in GHC at the moment, but seems so short and simple that I'm going to leave it here
substRulesForImportedIds :: Subst -> [CoreRule] -> [CoreRule] Source
substTerm :: SDoc -> Subst -> SeqCoreTerm -> SeqCoreTerm Source
substBind :: Subst -> SeqCoreBind -> (Subst, SeqCoreBind) Source
Apply a substititon to an entire CoreBind
, additionally returning an updated Subst
that should be used by subsequent substitutons.
substBindSC :: Subst -> SeqCoreBind -> (Subst, SeqCoreBind) Source
Apply a substititon to an entire CoreBind
, additionally returning an updated Subst
that should be used by subsequent substitutons.
substUnfoldingSC :: Subst -> Unfolding -> Unfolding Source
Substitutes for the Id
s within an unfolding
lookupIdSubst :: SDoc -> Subst -> Id -> SeqCoreTerm Source
lookupCvSubst :: Subst -> CoVar -> Coercion Source
substIdOcc :: Subst -> Id -> Id Source
substVarSet :: Subst -> VarSet -> VarSet Source
Operations on substitutions
mkEmptySubst :: InScopeSet -> Subst Source
mkSubst :: InScopeSet -> TvSubstEnv -> CvSubstEnv -> IdSubstEnv -> Subst Source
mkOpenSubst :: InScopeSet -> [(Var, SeqCoreTerm)] -> Subst Source
Simultaneously substitute for a bunch of variables No left-right shadowing ie the substitution for (x y. e) a1 a2 so neither x nor y scope over a1 a2
substInScope :: Subst -> InScopeSet Source
Find the in-scope set: see CoreSubst
isEmptySubst :: Subst -> Bool Source
extendIdSubst :: Subst -> Id -> SeqCoreTerm -> Subst Source
extendIdSubstList :: Subst -> [(Id, SeqCoreTerm)] -> Subst Source
Adds multiple Id
substitutions to the Subst
: see also extendIdSubst
extendTvSubstList :: Subst -> [(TyVar, Type)] -> Subst Source
Adds multiple TyVar
substitutions to the Subst
: see also extendTvSubst
extendCvSubstList :: Subst -> [(CoVar, Coercion)] -> Subst Source
Adds multiple CoVar
-> Coercion
substitutions to the
Subst
: see also extendCvSubst
extendSubst :: Subst -> Var -> SeqCoreTerm -> Subst Source
Add a substitution appropriate to the thing being substituted
(whether an expression, type, or coercion). See also
extendIdSubst
, extendTvSubst
, and extendCvSubst
.
extendSubstList :: Subst -> [(Var, SeqCoreTerm)] -> Subst Source
Add a substitution as appropriate to each of the terms being
substituted (whether expressions, types, or coercions). See also
extendSubst
.
zapSubstEnv :: Subst -> Subst Source
addInScopeSet :: Subst -> VarSet -> Subst Source
Add the Var
to the in-scope set, but do not remove
any existing substitutions for it
extendInScope :: Subst -> Var -> Subst Source
Add the Var
to the in-scope set: as a side effect,
and remove any existing substitutions for it
extendInScopeList :: Subst -> [Var] -> Subst Source
Add the Var
s to the in-scope set: see also extendInScope
extendInScopeIds :: Subst -> [Id] -> Subst Source
Optimized version of extendInScopeList
that can be used if you are certain
all the things being added are Id
s and hence none are TyVar
s or CoVar
s
setInScope :: Subst -> InScopeSet -> Subst Source
Substituting and cloning binders
substRecBndrs :: Subst -> [Id] -> (Subst, [Id]) Source
Substitute in a mutually recursive group of Id
s
cloneBndrs :: Subst -> UniqSupply -> [Var] -> (Subst, [Var]) Source
cloneIdBndr :: Subst -> UniqSupply -> Id -> (Subst, Id) Source
cloneIdBndrs :: Subst -> UniqSupply -> [Id] -> (Subst, [Id]) Source
Applies cloneIdBndr
to a number of Id
s, accumulating a final
substitution from left to right
cloneRecIdBndrs :: Subst -> UniqSupply -> [Id] -> (Subst, [Id]) Source
Clone a mutually recursive group of Id
s