haskell中的代数类型

时间:2008-11-26 12:39:38

标签: haskell functional-programming

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

3 个答案:

答案 0 :(得分:3)

我不确定你的意思,但如果你有一个表达式数据类型,你可以定义一个递归的eval函数。在这种情况下,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

一旦将变量添加到语言中,它就变得非常有趣,但这是表达式评估器的最基本形式。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

模块Expr在哪里

- 变量由字符串命名,假定为标识符。 输入Variable = String

- 表达式的表示。 data Expr = Const Integer           | 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和 简化常数子表达式,例如,加(Const 1)(Const 2)将成为Const 3.我不希望连接变量(或变量和常量):Var“st”是Var“s”的不同变量。

他们需要像下面那样写 简化(加(Var'x')(Const 0))= Var“x”