【发布时间】:2018-03-20 18:52:00
【问题描述】:
我有一个初等数学算术表达式的 AST:
data Expr = Constant Int
| Variable String
| Add Expr Expr
| Multiply Expr Expr
deriving (Show)
我还有一个非常简单的函数可以简化给定的表达式:
simplify :: Expr -> Expr
simplify (Add (Constant 0) e) = simplify e
simplify (Add e (Constant 0)) = simplify e
simplify (Add (Constant a) (Constant b)) = Constant (a + b)
simplify (Add e1 e2) = Add (simplify e1) (simplify e2)
simplify (Multiply (Constant 0) _) = Constant 0
simplify (Multiply _ (Constant 0)) = Constant 0
simplify (Multiply (Constant 1) e) = e
simplify (Multiply e (Constant 1)) = e
simplify (Multiply (Constant a) (Constant b)) = Constant (a * b)
simplify (Multiply e1 e2) = Multiply (simplify e1) (simplify e2)
simplify e = e
不幸的是,这个函数不是很有效,因为它简化了从根到叶(从上到下)的表达。考虑这个表达式:
exampleExpr :: Expr
exampleExpr = Add
(Multiply (Constant 1) (Variable "redrum"))
(Multiply (Constant 0) (Constant 451))
需要两次函数调用 (simplify (simplify exampleExpr)) 才能将此表达式简化为 Variable "redrum"。使用自下而上的方法,它应该只需要一次函数调用。
我还没有足够的经验来有效地编写此代码。所以我的问题是:如何重写这个函数来简化从叶子到根(从下到上)的给定表达式?
【问题讨论】:
标签: haskell