2017-10-17 149 views
1

我在編寫Haskell中的簡單函數時遇到了麻煩......它意在計算從1到n的數字之和。我不允許使用if語句,因爲我的老師希望我們專注於函數式編程。任何幫助,將不勝感激。謝謝!Haskell中的求和 - 函數式編程

summation :: Integer -> Integer 
summation n 
    | n > 1 = n + summation(n-1) 
    | n == 1 = 1 

這是GHCI輸出:

clase4.hs:13:28: error: 
    Variable not in scope: (?) :: Integer -> Integer -> Integer 
Failed, modules loaded: none. 

線13:

 | n > 1 = n + summation(n-1) 

我評論說一切在該文件中,我仍然得到這個錯誤。我看不見 '?'任何地方。這是屏幕截圖:

File

GHCi output

+4

'?'是不是該代碼。你可以創建一個[mcve]嗎? – 4castle

+0

順便說,有一個[對於更有效的算法(https://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF#Partial_sums)。 – 4castle

+0

這就是我寫的'?'沒有出現在文件的任何地方 –

回答

10

在源文件中clase4.hs,你認爲是在表達一個標準的ASCII字符的減號n-1不是字符。相反,你可能使用了一些其他的Unicode字符,像一個「破折號」或東西,只有看起來像一個減號(也許是因爲你編輯的文件在Microsoft Word等奇怪的東西或複製和粘貼代碼從一些與角色混淆的來源)。

Haskell是打印無效字符爲「?」因爲,就其可以說,您的輸出終端不支持顯示錯誤字符所需的編碼。 (這是在Windows環境下運行Haskell時的一個常見問題,雖然它可能發生在其他平臺上,如果事情設置很奇怪。)

用適當的文本編輯器打開源文件,突出顯示「減號」,然後重新鍵入您的鍵盤。在西班牙語鍵盤上,這應該是右下角Shift鍵左側的關鍵;在美式鍵盤上,它位於零鍵的右側。

如果失敗,嘗試複製和從堆棧溢出上面粘貼自己的程序進入一個全新的文本文件,並編譯 - 複製,並從你的問題粘貼爲我們其餘的正常工作。

+0

就是這樣!改變角色的工作,我仍然不知道我是如何傾倒它,爲什麼當我粘貼代碼在這裏成爲一個負號,但我不認爲這是非常重要的。非常感謝!! –

1

在我看來,有兩個問題在這裏:

  1. 您的遞歸調用調用sumatoria而你的函數是summation;
  2. 你檢查n > 1n == 1這是相當不安全的。

我們可以通過summation subsituting sumatoria解決的問題,使警衛更安全:

summation :: Integer -> Integer 
summation n 
    | n >= 1 = n + summation (n-1) 
    | otherwise = 0

現在,它應該工作。我們使用otherwise = 0,如果我們輸入0或負數,我們獲得0

儘管如此,我們仍然可以改進這個功能。首先,我們不應該只限於Integer s。我們可以使用任何種類的Num埃裏克類型aOrd erable。通過使用

summation :: (Num a, Ord a) => a -> a 
summation n 
    | n > 1 = n + summation (n-1) 
    | otherwise = 0

,此外的1..n0..n可以計算的總和::所以我們可以把它改寫爲

n 
--- 
\   n * (n+1) 
/ i = --------- 
---   2 
i=1

所以我們可以把它寫成:

summation :: Integral a => a -> a 
summation n = div (n * (n+1)) 2 

div :: Integral a => a -> a -> a要求aIntegral。如果乘法,增量和除法全部都是O(1)操作,則這是現在的函數。

最後要注意的是,除了使用遞歸之外,還可以使用像sum這樣的函數。在這種情況下,你也可以使用:

summation :: (Enum a, Num a) => a -> a 
summation n = sum [1..n] 
+0

非常感謝!原始文件是西班牙文,所以它在任何地方都可以讀到sumatoria,我已經把它翻譯成總結在這裏發佈,並忘記改變它。我喜歡你的方法,但我仍然想明白爲什麼我沒有工作。 –

+0

@SantiagoAguilar:您的源代碼在兩個變量之間包含問號「?」。但我們看不到。 –

+0

我看不到'?'任何地方。我已經上傳了文件和輸出的圖片。謝謝!! –