如何使用基本算术简化表达式?
3 回答
我不确定你的意思,但如果你有一个表达式数据类型,你可以定义一个递归评估函数。在这种情况下,eval 意味着简化。
例如,
data Exp = Lit Int
| Plus Exp Exp
| Times Exp Exp
eval :: Exp -> Int
eval (Lit x) = x
eval (Plus x y) = eval x + eval y
eval (Times x y) = eval x * eval y
一旦向语言中添加变量,它就会变得非常有趣,但这是表达式求值器的最基本形式。
您可以使用此处描述的技术:http: //augustss.blogspot.com/2007/04/overloading-haskell-numbers-part-2.html。使您的类型成为必需的类型类(Num、Fractional、Floating),以便 -、+、* 等适用于您的类型。然后如果表达式树最终构建完成,你可以对其进行操作,看看你可以简化什么。
模块 Expr 其中
-- 变量由字符串命名,假定为标识符。类型变量 = 字符串
-- 表达式的表示。数据表达式 = 常量整数 | Var 变量 | 加 Expr Expr | 减 Expr Expr | Mult Expr Expr 推导 (Eq, Show)
诸如 0*e=e*0=0 和 1*e=e*1=0+e=e+0=e-0=e 之类的简化以及简化常量子表达式,例如 Plus (Const 1) (Const 2) 会变为 Const 3。我不希望变量(或变量和常量)被连接:Var“st”是与 Var“s”不同的变量。
它们需要像下面这样写 化简 (Plus (Var'x') (Const 0)) = Var"x"