Common sub-expression elimination and variable hoisting for Lam
expressions.
- substitute :: (ExprEq expr, Typeable ra, Typeable a, Typeable rb, Typeable b) => Lam expr ra a -> Lam expr ra a -> Lam expr rb b -> Lam expr rb b
- count :: (ExprEq expr, Typeable ra, Typeable a, Typeable rb, Typeable b) => Lam expr ra a -> Lam expr rb b -> Integer
- countM :: (ExprEq expr, Typeable ra, Typeable a, Typeable rb, Typeable b) => Lam expr ra a -> Lam expr rb b -> State Integer Integer
- countNonEq :: (ExprEq expr, Typeable ra, Typeable a, Typeable rb, Typeable b) => Lam expr ra a -> Lam expr rb b -> State Integer Integer
- data SomeLam expr = forall ra a . (Typeable ra, Typeable a) => SomeLam (Lam expr ra a)
- data Params expr = Params {
- necessary :: SomeLam expr -> Bool
- sufficient :: SomeLam expr -> Bool
- sharingPoint :: SomeLam expr -> Bool
- data Env expr = Env {}
- simpleParams :: Params expr
- initEnv :: (ExprEq expr, Typeable ra, Typeable a) => Lam expr ra a -> Env expr
- compound :: Lam expr ra a -> Bool
- independent :: Lam expr ra a -> Bool
- liftable :: (Typeable ra, Typeable a) => Params expr -> Env expr -> Lam expr ra a -> Bool
- choose :: (Typeable ra, Typeable a) => Params expr -> Env expr -> Lam expr ra a -> Maybe (SomeLam expr)
- sharing :: forall expr ra a. (ExprEq expr, Typeable ra, Typeable a) => Params expr -> Lam expr ra a -> Lam expr ra a
- descend :: (ExprEq expr, Typeable ra, Typeable a) => Params expr -> Lam expr ra a -> Lam expr ra a
- simpleSharing :: (ExprEq expr, Typeable ra, Typeable a) => Lam expr ra a -> Lam expr ra a
- isFunction :: forall expr ra a. Typeable a => Lam expr ra a -> Bool
Documentation
:: (ExprEq expr, Typeable ra, Typeable a, Typeable rb, Typeable b) | |
=> Lam expr ra a | Sub-expression to be replaced |
-> Lam expr ra a | Replacing sub-expression |
-> Lam expr rb b | Whole expression |
-> Lam expr rb b |
Substituting a sub-expression
:: (ExprEq expr, Typeable ra, Typeable a, Typeable rb, Typeable b) | |
=> Lam expr ra a | Sub-expression |
-> Lam expr rb b | Whole expression |
-> Integer |
Count the number of occurrences of a sub-expression
countM :: (ExprEq expr, Typeable ra, Typeable a, Typeable rb, Typeable b) => Lam expr ra a -> Lam expr rb b -> State Integer IntegerSource
countNonEq :: (ExprEq expr, Typeable ra, Typeable a, Typeable rb, Typeable b) => Lam expr ra a -> Lam expr rb b -> State Integer IntegerSource
Custom parameters to sharing transformation. The necessary
predicate
gives a necessary condition for lifting an expression, and sufficient
gives
a sufficient condition. Note that necessary
takes precedence over
sufficient
.
The sharingPoint
field determines whether the expression is a valid point
for introducing a Let
.
Params | |
|
simpleParams :: Params exprSource
independent :: Lam expr ra a -> BoolSource
Checks if the expression does not contain any PLACEHOLDER
variables
liftable :: (Typeable ra, Typeable a) => Params expr -> Env expr -> Lam expr ra a -> BoolSource
Checks whether a sub-expression in a given environment can be lifted out
choose :: (Typeable ra, Typeable a) => Params expr -> Env expr -> Lam expr ra a -> Maybe (SomeLam expr)Source
Chooses a sub-expression to lift out
sharing :: forall expr ra a. (ExprEq expr, Typeable ra, Typeable a) => Params expr -> Lam expr ra a -> Lam expr ra aSource
Perform common sub-expression elimination and variable hoisting