2010-10-09 95 views
1

评估分化我想用户输入的DIFF X^3和得到的答案为3倍^ 2如何写算术表达式在Haskell

我怎么能写这样的评价算术表达式?

什么是Haskell中做到这一点的最好方法是什么?

谢谢。

+0

这是功课? – 2010-10-09 18:06:30

+1

你是什么意思“写算术表达式”?你只是想要一个玩具差异化引擎?还是你想要做更普遍的事情? – 2010-10-09 18:07:38

+0

我想用建一个haskell.Say科学计算器,如果我们有数据类型的数据Expr的=瓦尔诠释 | Add Expr Expr | Mul Expr Expr 我们可以按如下方式表示1+(2 * 3):Add(Val 1)(Mul(Val 2)(Val 3)) 并使用类似下面的方法:: ExprInt size N)= 1个 大小(添加XY)=大小x +大小Y. 尺寸(Mul的XY)=尺寸X *大小Y.我们可以为日式做计算。(接到了一个幻灯片这个例子中)我要的是写这样的差异化表达式,以便于处理。我试过了,但我想我没有正确地理解这个概念。我该怎么做 – 2010-10-09 18:51:17

回答

2

这里是一个blog post,让使用重载一个整洁的方式。或者here

+0

非常感谢,我将不得不考虑这deeply.I只拥有基本的知识haskell.But我真的很喜欢做的科学计算器,再包括差异化功能和其他calculations.Thanks。 – 2010-10-09 18:59:32

0

自动分化,如supercooldave给出的,是你想要的东西有点重量级。更好,更简单地从你想要的开始,无分化 - 一种将字符串解析到表达式树中,评估它们并显示它们的方法。一旦你有了这些,那么你只需要编码链规则和一些原语!

起初像

Expr = ENum Double | EVar String | EBinOp BinOp Expr Expr | EUnaryOp UnOp Expr 

BinOp = Mul | Add | Div | Pow 
UnOp = Diff String | Negate | Abs 
5

这里是一个非常简单的版本试试结构简单;随意扩展 - 添加评价,几个变量,更多的功能,术语的分组,漂亮的印花,解析等

data Expr = Const Float | Var | Sum Expr Expr | Product Expr Expr 
      deriving Show 

diff :: Expr -> Expr 
diff (Const _) = Const 0 
diff Var = Const 1 
diff (Sum f g) = Sum (diff f) (diff g) 
diff (Product f g) = Sum (Product f (diff g)) (Product (diff f) g) 
+0

非常感谢。我正在尝试使用这个例子吗?但是我得到了一些错误。什么样的表达式可以和sum? – 2010-10-11 12:11:06

+0

@ sunshine:'Sum Var(Const 2)'是x + 2; '总和(产品变量Var)(产品Var(产品Var Var))'是x^2 + x^3。 – sdcvvc 2010-10-11 12:24:26