如何编写算术表达式来评估haskell中的区分

时间:2010-10-09 16:28:56

标签: haskell

我希望用户输入为Diff x ^ 3并获得3x ^ 2

的答案

如何为此评估编写算术表达式?

在haskell中执行此操作的最佳方法是什么?

谢谢。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

这是一个blog post,它提供了一种使用重载的简洁方法。或here

答案 2 :(得分:0)

由supercooldave给出的自动区分对于你想要的东西来说有点重量级。更好,更简单地从你想要的东西开始,没有区别 - 一种将字符串解析为表达式树,评估它们并显示它们的方法。一旦你失败了,那么你只需要编写链规则和一些原语!

首先尝试一个简单的结构,如

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

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