Safe Haskell | None |
---|---|
Language | Haskell98 |
Expand synonyms
expandSyns :: Type -> Q Type
Expands all type synonyms in the given type. Type families currently won't be expanded (but will be passed through).
Misc utilities
substInType :: (Name, Type) -> Type -> Type
Capture-free substitution
substInCon :: (Name, Type) -> Con -> Con
Capture-free substitution
evades :: Data t => [Name] -> t -> [Name]
Make a list of names (based on the first arg) such that every name in the result is distinct from every name in the second arg, and from the other results
evade :: Data d => Name -> d -> Name
Make a name (based on the first arg) that's distinct from every name in the second arg
Example why this is necessary:
type E x = forall y. Either x y ... expandSyns [t| forall y. y -> E y |]
The example as given may actually work correctly without any special capture-avoidance depending
on how GHC handles the y
s, but in any case, the input type to expandSyns may be an explicit
AST using mkName
to ensure a collision.