2015-04-03 126 views
0

我寫了下面的代碼:從高階函數

hosum :: (Int->Int)->(Int->Int)  
hosum f 0 = 1 
hosum f n = afunction f (-abs(n)) (abs(n)) 


afunction :: (Int->Int)->Int->Int->Int 
afunction f a z 
    |a==z 
     = 0 
    |otherwise 
     = afunction f (a+1) z + afunction f a z 

找到F(I)的總和 - | N | to | n | ..我的錯誤在哪裏?

+7

你永遠不會調用'f'。嘗試刪除類型簽名並查看您的函數的GHC類型(f參數將完全是多態的)。 – 2015-04-03 00:50:47

+0

作爲@jcast說:你只需要一個更多的''否則''情況下,但手動遞歸是很好的開始我會建議考慮如何用'map'和'sum'來代替 - ** PS * * hosum是什麼?我可以在這裏刪除它 - 也可以嘗試找到更好的函數名稱,並舉例說明如何調用你的函數 - 這裏有點奇怪 – Carsten 2015-04-03 05:27:10

+0

@jcast我不明白你在說什麼,只是因爲我是一個初學者哈斯克爾...這個練習是爲我的班級和我的教授告訴我們,使這個函數從以下開始:hosum ::(Int-> Int) - >(Int-> Int)hosum fn。更清楚的事情將是有益的 – 2015-04-03 08:40:48

回答

1

正如評論中指出的那樣,您的代碼永遠不會調用f函數。您的代碼中還有其他一些內容我不明白:

  1. hosum f 0 = 1。爲什麼它是任何一個f。不應該是f 0

  2. afunction,爲什麼結果0 if a == z。如果範圍是包含的,則只有在a > z的情況下才應該爲零。

  3. afunctionotherwise的情況下自己調用兩次。爲什麼不適用fa並且只能撥打afunction f (a + 1) z

現在講一個正確的解決方案。 實現它的最簡單(和慣用)的方法是使用標準summap函數。它提供了一個一行(如果我們不指望類型簽名):

hosum :: (Int -> Int) -> Int -> Int 
hosum f n = sum $ map f [-abs(n)..abs(n)] 

用簡單的英語,這一函數的所有號碼從-abs(n)abs(n)列表,適用f他們每個人並總結他們向上。這正是問題陳述告訴我們要做的。

+0

此外,如果我有一個函數列表和另一個列表來創建一個新列表,其中一個列表中的每個元素映射到另一個列表的另一個元素,我該怎麼辦?例如,應用[(^ 2),(^ 3),(^ 4),(2 ^)] [10] = [100,1000,1024,10000]。每個列表的長度可能更大 – 2015-04-03 11:03:09

+0

@您可以使用列表解析。像這樣:'[f x | f < - [(2 *),(2+)],x < - [1,2]]'='[2,4,3,4]'。 – kraskevich 2015-04-03 13:50:35