2013-03-17 77 views
0

我想解決一個動態生成的等式。我在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) 
+1

我不太清楚什麼是關於你的示例函數的「高(er?)次序」,以及我想要逐點添加函數的方式,而不是追加它們。所以我可能會誤解你,但建議下面的解決方案仍然... – gspr 2013-03-17 22:37:38

+0

看看haskell維基[這裏](http://www.haskell.org/haskellwiki/Add_polynomials) – zurgl 2013-03-17 23:45:26

+2

由於有一個公認的答案,我正在寫這個評論:對於這種「加入」,'( - >)r的['Applicative'](http://learnyouahaskell.com/functors-applicative-functors-and-monoids) '是非常有幫助的:'newfunc =(+)<$> func1 <*> func2'。請注意,這適用於各種n元操作員,而不僅僅是加法。 – phg 2013-03-18 12:08:07

回答

5

肯定。然而函數值必須有一個加法的概念,所以我們必須限制到(Num b) => a -> b類型的函數。然後,你可以簡單地做

functionSum :: (Num b) => (a -> b) -> (a -> b) -> (a -> b) 
functionSum f g x = (f x) + (g x) 

(我使用名稱join避免,因爲大多數人可能會再想想this完善的功能)。

因此,舉例來說,如果

func1 :: Double -> Double 
func1 x = 1+2*x+5*x^2 

func2 :: Double -> Double 
func2 x = 5+4*x+2*x^3 

然後

*> :t (functionSum func1 func2) 
(functionSum func1 func2) :: Double -> Double 

你似乎你有存儲係數的名單多項式你的問題的部分來表示。如果[a0, a1, a2, ...]描述了多項式a0 + a1 * x + ...,那麼您也可以使用zipWith (+) list1 list2來生成一個表示兩個多項式和的係數的新列表。請小心處理有限的不同長度列表的情況,思考(提示:將較短的列表添加零以匹配較長的長度)。

+0

順便說一下,有人知道爲什麼'(Num b)=>(a - > b)'不是'Num'的一個實例嗎?它是否會像(經常)那樣下降到'Num'古怪? – gspr 2013-03-17 23:06:06

+4

歷史上'實例(Num b)=> Num(a - > b)'是不可能的,因爲'Num'是'Eq'的子類。現在可能了,但我不一定認爲它是一個好主意 - 函數到'Num'字段確實形成[_vector space_](http://hackage.haskell.org/packages/archive/vector-space /0.8.6/doc/html/Data-VectorSpace.html),但是像逐點乘法這樣的操作在概念上通常並沒有意義,因爲它破壞了基本不變性的矢量空間。因此,我寧願將兩個班級分開。 – leftaroundabout 2013-03-17 23:36:14

+0

好點。謝謝。我忘記了整個EQ的事情。 – gspr 2013-03-17 23:55:23