- type Exporter = Functions -> FilePath -> IO ()
- simplifyExpr :: [Expr -> Expr] -> Expr -> Expr
- commonRuleHigherPrec :: Expr -> Expr
- commonRuleAtomic :: Expr -> Expr
- commonRuleLeftToRight :: Expr -> Expr
- commonRuleAssocRight :: Expr -> Expr
- commonRuleFuncOp :: Expr -> Expr
- commonRulesForSimplifyingExprs :: [Expr -> Expr]
- ruleIfRight :: Expr -> Expr
- ruleRightToLeft :: Expr -> Expr
- applyFirstMatch :: [Expr -> Expr] -> Expr -> Expr
- findFixed :: Eq a => (a -> a) -> a -> a

# Documentation

type Exporter = Functions -> FilePath -> IO ()Source

The type of a function to export (user) functions to a file.

simplifyExpr :: [Expr -> Expr] -> Expr -> ExprSource

Simplify an expression by applying rules top-down throughout the expression tree and repeatedly until there is no change. This is intended for removing extra parentheses, but could be used for other forms of simplification.

Should each rule also know the level in the original expr tree, with 0 = top level (root)? That would require additional arguments.

commonRuleHigherPrec :: Expr -> ExprSource

Common rules for simplifying parentheses.

Remove ()'s around a higher precedence operator: e.g., (a * b) + c ==> a * b + c a + (b * c) ==> a + b * c

commonRuleAtomic :: Expr -> ExprSource

Remove ()'s around an atomic expression -- a variable, literal, or list

commonRuleLeftToRight :: Expr -> ExprSource

Remove ()'s in the case of (a op1 b) op2 c, if op1 and op2 have the same precedence, and both group left to right, since left to right evaluation makes them unnecessary.

commonRuleFuncOp :: Expr -> ExprSource

commonRulesForSimplifyingExprs :: [Expr -> Expr]Source

A list of common rules for simplifying expressions. Does *not* include ruleIfRight, since that works for Haskell but not Python.

ruleIfRight :: Expr -> ExprSource

ruleRightToLeft :: Expr -> ExprSource

Remove ()'s in the case of a op (b op c) if op groups right to left, and note that it is the same operator op in both places (though I don't know if that restriction is necessary). This applies to (:) in Haskell, for example: x : y : zs == x : (y : zs)

applyFirstMatch :: [Expr -> Expr] -> Expr -> ExprSource

Try the first rule in a list to see if it changes an expression, returning the new expression if it does; otherwise, try the next rule, and so on; if no rule changes the expression, then return the expression. (Note that (applyFirstMatch rules) is itself a rule.)