2010-10-09 94 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