我想解決一個動態生成的等式。我在HackageDB中找到了一個好的庫 ,它可以使用Newton-Raphson方法計算近似的根。但是,牛頓函數將函數(類型簽名Num a => a - > a)作爲方程。 我的問題是,它可能附加功能在一起?例如:(不正確的語法)如何加入兩個高階函數?
join :: (a->a) ->(a->a)->(a->a)
join func1 func2 = func1+func2
For instance:
if func1 = 1+2*X+5*X^2 , func2 = 5 + 4*x + 2*x^3
then func3 = join func1 func2
func3 is `6 + 6*x + 5*x^2 + 2*x^3?
我想兩種方法來做到這一點。因爲每個小功能是動態生成的,我將不得不簡化函數形式上方,然後存儲在一個數據類型的信息。例如:(不正確的語法)
data FuncInfo = Info [Double]
if 1 + 2*x + 3*x^2 ----> Info [1,2,3]
5 + 4*x^3 ----> Info [5,0,0,4]
這種方式相加兩個數據和創建新功能應該很容易。但是,實際上這並不容易,因爲動態生成的小函數實際上很難簡化(一個小函數可能看起來像這樣:10/(1+x)^5
)。
我想到另一種方式是將功能只是追加在一起,這樣就沒有必要做簡單化,也不存儲到一個新的數據類型,例如:
func1 = 10/(1+x) ^5
func2 = 25/(1+x) ^9
newfunc = (10/(1+x) ^5) + (25/(1+x) ^9)
我不太清楚什麼是關於你的示例函數的「高(er?)次序」,以及我想要逐點添加函數的方式,而不是追加它們。所以我可能會誤解你,但建議下面的解決方案仍然... – gspr 2013-03-17 22:37:38
看看haskell維基[這裏](http://www.haskell.org/haskellwiki/Add_polynomials) – zurgl 2013-03-17 23:45:26
由於有一個公認的答案,我正在寫這個評論:對於這種「加入」,'( - >)r的['Applicative'](http://learnyouahaskell.com/functors-applicative-functors-and-monoids) '是非常有幫助的:'newfunc =(+)<$> func1 <*> func2'。請注意,這適用於各種n元操作員,而不僅僅是加法。 – phg 2013-03-18 12:08:07