| Safe Haskell | Safe |
|---|---|
| Language | Haskell2010 |
ReWire.HSE.Desugar
Synopsis
- desugar :: MonadError AstError m => Renamer -> Module Annote -> m (Module Annote)
- addMainModuleHead :: Module a -> Module a
- data Desugar (m :: Type -> Type) = Desugar {
- dsModule :: Tr m (Module Annote)
- dsPat :: Tr m (Pat Annote)
- dsConDecl :: Tr m (ConDecl Annote)
- dsExp :: Tr m (Exp Annote)
- dsType :: Tr m (Type Annote)
- dsDeclHead :: Tr m (DeclHead Annote)
- dsBinds :: Tr m (Binds Annote)
- dsMatch :: Tr m (Match Annote)
- dsAlt :: Tr m (Alt Annote)
- dsQName :: Tr m (QName Annote)
- dsDecl :: Tr m (Decl Annote)
- pass :: Monad m => Desugar m -> Module Annote -> m (Module Annote)
- type Fresh = Int
- fresh :: (MonadState Fresh m, Monad m) => Annote -> m (Name Annote)
- err :: Annote -> String -> Exp Annote
- mkTuple :: Annote -> Int -> Name Annote
- desugarRecords :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Renamer -> Desugar m
- normIds :: forall (m :: Type -> Type). Monad m => Desugar m
- deparenify :: forall (m :: Type -> Type). Monad m => Desugar m
- desugarInfix :: forall (m :: Type -> Type). MonadState Fresh m => Desugar m
- desugarNegLitPats :: forall (m :: Type -> Type). Monad m => Desugar m
- desugarTuples :: forall (m :: Type -> Type). Monad m => Desugar m
- desugarFuns :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Desugar m
- liftDiscriminator :: forall (m :: Type -> Type). MonadState Fresh m => Desugar m
- flattenAlts :: forall (m :: Type -> Type). Monad m => Desugar m
- desugarGuards :: forall (m :: Type -> Type). MonadState Fresh m => Desugar m
- wheresToLets :: forall (m :: Type -> Type). MonadError AstError m => Desugar m
- desugarDos :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Desugar m
- normTyContext :: forall (m :: Type -> Type). Monad m => Desugar m
- desugarTyFuns :: forall (m :: Type -> Type). Monad m => Desugar m
- desugarLets :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Desugar m
- desugarIfs :: forall (m :: Type -> Type). Monad m => Desugar m
- desugarNegs :: forall (m :: Type -> Type). Monad m => Desugar m
- flattenLambdas :: forall (m :: Type -> Type). Monad m => Desugar m
- depatLambdas :: forall (m :: Type -> Type). MonadState Fresh m => Desugar m
- desugarAsPats :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Desugar m
- lambdasToCases :: forall (m :: Type -> Type). Monad m => Desugar m
Documentation
desugar :: MonadError AstError m => Renamer -> Module Annote -> m (Module Annote) Source #
Desugar into lambdas then normalize the lambdas.
addMainModuleHead :: Module a -> Module a Source #
Adds the "module Main where" if no module given (but not the "main" export).
The Desugar machinery and individual sub-passes, exported so
that Embedder.HSE.Desugar can compose its own desugaring
pipeline.
data Desugar (m :: Type -> Type) Source #
Constructors
| Desugar | |
Fields
| |
desugarRecords :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Renamer -> Desugar m Source #
Desugar record type defs, field accessors, record patterns, record construction expressions, and record update syntax.
R {f = a}becomes
R _ a _
and
r { f = a }becomes
case r of R x0 _ x1 -> R x0 a x1
normIds :: forall (m :: Type -> Type). Monad m => Desugar m Source #
Turns Specials into normal identifiers.
deparenify :: forall (m :: Type -> Type). Monad m => Desugar m Source #
Removes parens in types, expressions, and patterns so they don't confuddle everything.
desugarInfix :: forall (m :: Type -> Type). MonadState Fresh m => Desugar m Source #
Turns sections and infix ops into regular applications and lambdas.
desugarNegLitPats :: forall (m :: Type -> Type). Monad m => Desugar m Source #
TODO Apparently this should actually desugar to guards:
f (-k) = v
is actually sugar for
f z | z == negate (fromInteger k) = v
desugarTuples :: forall (m :: Type -> Type). Monad m => Desugar m Source #
Turns tuples into applications of a tuple constructor (also in types and pats):
(x, y, z)
becomes
((,,) x y z)
desugarFuns :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Desugar m Source #
Turns piece-wise function definitions into a single PatBind with a lambda and case expression on the RHS. E.g.:
f p1 p2 = rhs1 f q1 q2 = rhs2
becomes
f = \ $1 $2 -> case ($1, $2) of { (p1, p2) -> rhs1; (q1, q2) -> rhs2 }liftDiscriminator :: forall (m :: Type -> Type). MonadState Fresh m => Desugar m Source #
Turns
case e of {...}into
(\ x -> case x of {...}) eflattenAlts :: forall (m :: Type -> Type). Monad m => Desugar m Source #
Turn cases with multiple alts into cases with two alts: an alt with a pattern and another with a default, wildcard branch.
case x of p1 -> e1 p2 -> e2 p3 -> e3
becomes
case x of
p1 -> e1
_ -> case x of
p2 -> e2
_ -> case x of
p3 -> e3
_ -> undefineddesugarGuards :: forall (m :: Type -> Type). MonadState Fresh m => Desugar m Source #
Should run after function desugarage. From the Haskell 98 report:
case v of
p | g1 -> e1
| gn -> en where { decls }
_ -> e'
becomes
case e' of
y -> case v of
p -> let { decls } in
if g1 then e1 else if gn then en else y
_ -> ywheresToLets :: forall (m :: Type -> Type). MonadError AstError m => Desugar m Source #
Turns where clauses into lets. Only valid after guard desugarage. E.g.:
f x = a where a = b
becomes
f x = let a = b in a
desugarDos :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Desugar m Source #
Turns do-notation into a series of >>= \ x ->. Turns LetStmts into Lets. E.g.:
do p1 <- m let p2 = e return e
becomes
m >>= (\ p1 -> (let p2 = e in return e))
desugarTyFuns :: forall (m :: Type -> Type). Monad m => Desugar m Source #
Turns the type a -> b into (->) a b.
desugarLets :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Desugar m Source #
Turns Lets into Cases. Assumes functions in Lets are already desugared. E.g.:
let p = e1
q = e2
in e3becomes
case e1 of { p -> (case e2 of { q -> e3 } }desugarIfs :: forall (m :: Type -> Type). Monad m => Desugar m Source #
Turns ifs into cases.
if e1 then e2 else e3
becomes
case e1 of { True -> e2; False -> e3 }flattenLambdas :: forall (m :: Type -> Type). Monad m => Desugar m Source #
Turns Lambdas with several bindings into several lambdas with single bindings. E.g.:
\ p1 p2 -> e
becomes
\ p1 -> \ p2 -> e
depatLambdas :: forall (m :: Type -> Type). MonadState Fresh m => Desugar m Source #
Replaces non-var patterns in lambdas with a fresh var and a case. E.g.:
\ (a, b) -> e
becomes
\ $x -> case $x of { (a, b) -> e }desugarAsPats :: forall (m :: Type -> Type). (MonadState Fresh m, MonadError AstError m) => Desugar m Source #
Desugars as-patterns in (and only in) cases into more cases. Should run after depatLambdas. E.g.:
case e1 of x@(C y@p) -> e2
becomes
case e1 of { C p -> (\ x -> ((\ y -> e2) p)) (C p) }