Copyright | (C) 2014 Richard Eisenberg |
---|---|
License | BSD-style (see LICENSE) |
Maintainer | Richard Eisenberg (eir@cis.upenn.edu) |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
Language.Haskell.TH.Desugar
Contents
Description
Desugars full Template Haskell syntax into a smaller core syntax for further processing. The desugared types and constructors are prefixed with a D.
- data DExp
- data DLetDec
- data DPat
- data DType
- data DKind
- type DCxt = [DPred]
- data DPred
- data DTyVarBndr
- data DMatch = DMatch DPat DExp
- data DClause = DClause [DPat] DExp
- data DDec
- = DLetDec DLetDec
- | DDataD NewOrData DCxt Name [DTyVarBndr] [DCon] [Name]
- | DTySynD Name [DTyVarBndr] DType
- | DClassD DCxt Name [DTyVarBndr] [FunDep] [DDec]
- | DInstanceD DCxt DType [DDec]
- | DForeignD DForeign
- | DPragmaD DPragma
- | DFamilyD FamFlavour Name [DTyVarBndr] (Maybe DKind)
- | DDataInstD NewOrData DCxt Name [DType] [DCon] [Name]
- | DTySynInstD Name DTySynEqn
- | DClosedTypeFamilyD Name [DTyVarBndr] (Maybe DKind) [DTySynEqn]
- | DRoleAnnotD Name [Role]
- | DStandaloneDerivD DCxt DType
- | DDefaultSigD Name DType
- data NewOrData
- data DCon = DCon [DTyVarBndr] DCxt Name DConFields
- data DConFields
- = DNormalC [DStrictType]
- | DRecC [DVarStrictType]
- type DStrictType = (Strict, DType)
- type DVarStrictType = (Name, Strict, DType)
- data DForeign
- data DPragma
- data DRuleBndr
- data DTySynEqn = DTySynEqn [DType] DType
- data DInfo
- type DInstanceDec = DDec
- data Role :: *
- data AnnTarget :: *
- class Desugar th ds | ds -> th where
- dsExp :: DsMonad q => Exp -> q DExp
- dsDecs :: DsMonad q => [Dec] -> q [DDec]
- dsType :: DsMonad q => Type -> q DType
- dsKind :: DsMonad q => Kind -> q DKind
- dsInfo :: DsMonad q => Info -> q DInfo
- dsPatOverExp :: DsMonad q => Pat -> DExp -> q (DPat, DExp)
- dsPatsOverExp :: DsMonad q => [Pat] -> DExp -> q ([DPat], DExp)
- dsPatX :: DsMonad q => Pat -> q (DPat, [(Name, DExp)])
- dsLetDecs :: DsMonad q => [Dec] -> q [DLetDec]
- dsTvb :: DsMonad q => TyVarBndr -> q DTyVarBndr
- dsCxt :: DsMonad q => Cxt -> q DCxt
- dsCon :: DsMonad q => Con -> q DCon
- dsForeign :: DsMonad q => Foreign -> q DForeign
- dsPragma :: DsMonad q => Pragma -> q DPragma
- dsRuleBndr :: DsMonad q => RuleBndr -> q DRuleBndr
- type PatM q = WriterT [(Name, DExp)] q
- dsPred :: DsMonad q => Pred -> q DCxt
- dsPat :: DsMonad q => Pat -> PatM q DPat
- dsDec :: DsMonad q => Dec -> q [DDec]
- dsLetDec :: DsMonad q => Dec -> q [DLetDec]
- dsMatches :: DsMonad q => Name -> [Match] -> q [DMatch]
- dsBody :: DsMonad q => Body -> [Dec] -> DExp -> q DExp
- dsGuards :: DsMonad q => [(Guard, Exp)] -> DExp -> q DExp
- dsDoStmts :: DsMonad q => [Stmt] -> q DExp
- dsComp :: DsMonad q => [Stmt] -> q DExp
- dsClauses :: DsMonad q => Name -> [Clause] -> q [DClause]
- module Language.Haskell.TH.Desugar.Sweeten
- expand :: (DsMonad q, Data a) => a -> q a
- expandType :: DsMonad q => DType -> q DType
- reifyWithWarning :: Quasi q => Name -> q Info
- withLocalDeclarations :: DsMonad q => [Dec] -> DsM q a -> q a
- dsReify :: DsMonad q => Name -> q (Maybe DInfo)
- reifyWithLocals_maybe :: DsMonad q => Name -> q (Maybe Info)
- reifyWithLocals :: DsMonad q => Name -> q Info
- class Quasi m => DsMonad m where
- localDeclarations :: m [Dec]
- data DsM q a
- scExp :: DsMonad q => DExp -> q DExp
- scLetDec :: DsMonad q => DLetDec -> q DLetDec
- applyDExp :: DExp -> [DExp] -> DExp
- applyDType :: DType -> [DType] -> DType
- dPatToDExp :: DPat -> DExp
- removeWilds :: DsMonad q => DPat -> q DPat
- getDataD :: Quasi q => String -> Name -> q ([TyVarBndr], [Con])
- dataConNameToDataName :: Quasi q => Name -> q Name
- dataConNameToCon :: Quasi q => Name -> q Con
- nameOccursIn :: Data a => Name -> a -> Bool
- allNamesIn :: Data a => a -> [Name]
- flattenDValD :: Quasi q => DLetDec -> q [DLetDec]
- getRecordSelectors :: Quasi q => DType -> DCon -> q [DLetDec]
- mkTypeName :: Quasi q => String -> q Name
- mkDataName :: Quasi q => String -> q Name
- newUniqueName :: Quasi q => String -> q Name
- mkTupleDExp :: [DExp] -> DExp
- mkTupleDPat :: [DPat] -> DPat
- maybeDLetE :: [DLetDec] -> DExp -> DExp
- maybeDCaseE :: String -> DExp -> [DMatch] -> DExp
- substTy :: DsMonad q => Map Name DType -> DType -> q DType
- tupleDegree_maybe :: String -> Maybe Int
- tupleNameDegree_maybe :: Name -> Maybe Int
- unboxedTupleDegree_maybe :: String -> Maybe Int
- unboxedTupleNameDegree_maybe :: Name -> Maybe Int
- extractBoundNamesStmt :: Stmt -> Set Name
- extractBoundNamesDec :: Dec -> Set Name
- extractBoundNamesPat :: Pat -> Set Name
Desugared data types
Corresponds to TH's Exp
type. Note that DLamE
takes names, not patterns.
Declarations as used in a let
statement.
Corresponds to TH's Pat
type.
Corresponds to TH's Type
type.
Corresponds to TH's Kind
type, which is a synonym for Type
. DKind
, though,
only contains constructors that make sense for kinds.
Corresponds to TH's Pred
data DTyVarBndr Source
Corresponds to TH's TyVarBndr
. Note that PlainTV x
and KindedTV x StarT
are
distinct, so we retain that distinction here.
Corresponds to TH's Match
type.
Corresponds to TH's Clause
type.
Corresponds to TH's Dec
type.
Constructors
Is it a newtype
or a data
type?
Corresponds to TH's Con
type.
Constructors
DCon [DTyVarBndr] DCxt Name DConFields |
data DConFields Source
A list of fields either for a standard data constructor or a record data constructor.
Constructors
DNormalC [DStrictType] | |
DRecC [DVarStrictType] |
Instances
type DStrictType = (Strict, DType) Source
Corresponds to TH's StrictType
type.
type DVarStrictType = (Name, Strict, DType) Source
Corresponds to TH's VarStrictType
type.
Corresponds to TH's Foreign
type.
Corresponds to TH's Pragma
type.
Corresponds to TH's RuleBndr
type.
Constructors
DRuleVar Name | |
DTypedRuleVar Name DType |
Corresponds to TH's TySynEqn
type (to store type family equations).
Corresponds to TH's Info
type.
Constructors
DTyConI DDec (Maybe [DInstanceDec]) | |
DVarI Name DType (Maybe Name) Fixity | The |
DTyVarI Name DKind | |
DPrimTyConI Name Int Bool | The |
type DInstanceDec Source
Arguments
= DDec | Guaranteed to be an instance declaration |
data Role :: *
Role annotations
Constructors
NominalR | nominal |
RepresentationalR | representational |
PhantomR | phantom |
InferR | _ |
data AnnTarget :: *
Constructors
ModuleAnnotation | |
TypeAnnotation Name | |
ValueAnnotation Name |
The Desugar
class
Main desugaring functions
dsPatOverExp :: DsMonad q => Pat -> DExp -> q (DPat, DExp) Source
Desugar a pattern, along with processing a (desugared) expression that is the entire scope of the variables bound in the pattern.
dsPatsOverExp :: DsMonad q => [Pat] -> DExp -> q ([DPat], DExp) Source
Desugar multiple patterns. Like dsPatOverExp
.
dsPatX :: DsMonad q => Pat -> q (DPat, [(Name, DExp)]) Source
Desugar a pattern, returning a list of (Name, DExp) pairs of extra variables that must be bound within the scope of the pattern
dsLetDecs :: DsMonad q => [Dec] -> q [DLetDec] Source
Desugar Dec
s that can appear in a let expression
dsTvb :: DsMonad q => TyVarBndr -> q DTyVarBndr Source
Desugar a TyVarBndr
dsRuleBndr :: DsMonad q => RuleBndr -> q DRuleBndr Source
Desugar a RuleBndr
.
Secondary desugaring functions
type PatM q = WriterT [(Name, DExp)] q Source
Desugaring a pattern also returns the list of variables bound in as-patterns and the values they should be bound to. This variables must be brought into scope in the "body" of the pattern.
dsLetDec :: DsMonad q => Dec -> q [DLetDec] Source
Desugar a single Dec
, perhaps producing multiple DLetDec
s
Arguments
:: DsMonad q | |
=> Name | Name of the scrutinee, which must be a bare var |
-> [Match] | Matches of the |
-> q [DMatch] |
Desugar a list of matches for a case
statement
Arguments
:: DsMonad q | |
=> Body | body to desugar |
-> [Dec] | "where" declarations |
-> DExp | what to do if the guards don't match |
-> q DExp |
Desugar a Body
Arguments
:: DsMonad q | |
=> [(Guard, Exp)] | Guarded expressions |
-> DExp | What to do if none of the guards match |
-> q DExp |
Desugar guarded expressions
Desugar clauses to a function definition
Converting desugared AST back to TH AST
Expanding type synonyms
expandType :: DsMonad q => DType -> q DType Source
Expands all type synonyms in a desugared type. Also expands open type family applications, as long as the arguments have no free variables.
Reification
reifyWithWarning :: Quasi q => Name -> q Info Source
Reify a declaration, warning the user about splices if the reify fails. The warning says that reification can fail if you try to reify a type in the same splice as it is declared.
The following definitions allow you to register a list of
Dec
s to be used in reification queries.
withLocalDeclarations :: DsMonad q => [Dec] -> DsM q a -> q a Source
Add a list of declarations to be considered when reifying local declarations.
dsReify :: DsMonad q => Name -> q (Maybe DInfo) Source
Like reify
, but safer and desugared. Uses local declarations where
available.
reifyWithLocals_maybe :: DsMonad q => Name -> q (Maybe Info) Source
Like reify
from Template Haskell, but looks also in any not-yet-typechecked
declarations. To establish this list of not-yet-typechecked declarations,
use withLocalDeclarations
. Returns Nothing
if reification fails.
Note that no inferred type information is available from local declarations;
bottoms may be used if necessary.
reifyWithLocals :: DsMonad q => Name -> q Info Source
Like reifyWithLocals_maybe
, but throws an exception upon failure,
warning the user about separating splices.
A convenient implementation of the DsMonad
class. Use by calling
withLocalDeclarations
.
Nested pattern flattening
Utility functions
removeWilds :: DsMonad q => DPat -> q DPat Source
Remove all wildcards from a pattern, replacing any wildcard with a fresh variable
Arguments
:: Quasi q | |
=> String | Print this out on failure |
-> Name | Name of the datatype ( |
-> q ([TyVarBndr], [Con]) |
Extract the TyVarBndr
s and constructors given the Name
of a type
dataConNameToDataName :: Quasi q => Name -> q Name Source
From the name of a data constructor, retrive the datatype definition it is a part of.
dataConNameToCon :: Quasi q => Name -> q Con Source
From the name of a data constructor, retrieve its definition as a Con
nameOccursIn :: Data a => Name -> a -> Bool Source
Check if a name occurs anywhere within a TH tree.
allNamesIn :: Data a => a -> [Name] Source
Extract all Names mentioned in a TH tree.
flattenDValD :: Quasi q => DLetDec -> q [DLetDec] Source
If the declaration passed in is a DValD
, creates new, equivalent
declarations such that the DPat
in all DValD
s is just a plain
DVarPa
. Other declarations are passed through unchanged.
Note that the declarations that come out of this function are rather
less efficient than those that come in: they have many more pattern
matches.
mkTypeName :: Quasi q => String -> q Name Source
Like TH's lookupTypeName
, but if this name is not bound, then we assume
it is declared in the current module.
mkDataName :: Quasi q => String -> q Name Source
Like TH's lookupDataName
, but if this name is not bound, then we assume
it is declared in the current module.
newUniqueName :: Quasi q => String -> q Name Source
Like newName, but even more unique (unique across different splices),
and with unique nameBase
s.
maybeDLetE :: [DLetDec] -> DExp -> DExp Source
If decs is non-empty, delcare them in a let:
maybeDCaseE :: String -> DExp -> [DMatch] -> DExp Source
If matches is non-empty, make a case statement; otherwise make an error statement
substTy :: DsMonad q => Map Name DType -> DType -> q DType Source
Capture-avoiding substitution on types
tupleDegree_maybe :: String -> Maybe Int Source
Extract the degree of a tuple
tupleNameDegree_maybe :: Name -> Maybe Int Source
Extract the degree of a tuple name
unboxedTupleDegree_maybe :: String -> Maybe Int Source
Extract the degree of an unboxed tuple
unboxedTupleNameDegree_maybe :: Name -> Maybe Int Source
Extract the degree of a tuple name
Extracting bound names
extractBoundNamesStmt :: Stmt -> Set Name Source
Extract the names bound in a Stmt
extractBoundNamesDec :: Dec -> Set Name Source
Extract the names bound in a Dec
that could appear in a let
expression.
extractBoundNamesPat :: Pat -> Set Name Source
Extract the names bound in a Pat