2

如何使用基本算术简化表达式?

4

3 回答 3

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

一旦向语言中添加变量,它就会变得非常有趣,但这是表达式求值器的最基本形式。

于 2008-11-26T15:49:56.750 回答
1

您可以使用此处描述的技术:http: //augustss.blogspot.com/2007/04/overloading-haskell-numbers-part-2.html。使您的类型成为必需的类型类(Num、Fractional、Floating),以便 -、+、* 等适用于您的类型。然后如果表达式树最终构建完成,你可以对其进行操作,看看你可以简化什么。

于 2008-11-26T12:48:36.040 回答
0

模块 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"

于 2008-11-26T15:58:42.020 回答