2016-04-27 80 views
0

請大家幫忙,我一直試圖讓這段代碼正常工作,但是我找不到錯誤。以下是我的代碼函數式編程中的自定義正弦函數

sumToN f x 1 = f (x 1) 
sumToN f x n = f x n + f x (n-1) 

facOfN 0 = 1 
facOfN n = n * facOfN (n-1) sgfr 

sineApprox x n = ((-1)^n) * ((x ** (2*n+1))/facOfN(2*n+1) 
sine x n = sumToN (sineApprox x n) 

當我嘗試加載文件時出現以下錯誤。

ERROR file:F:\sine.hs:8 - Syntax error in expression (unexpected `;', possibly due to bad layout) 

任何援助將不勝感激。

+2

'sineApprox'行末尾缺少括號。 –

+1

這是擁抱嗎?在ghci中,錯誤更具描述性:'解析錯誤(可能是不正確的縮進或不匹配的括號)' – leftaroundabout

回答

3

正如評論中已經說過的,你已經忘記關閉一個paren。它會這樣工作:

sineApprox x n = ((-1)^n) * ((x ** (2*n+1))/facOfN(2*n+1)) 

請注意,使用更好的文本編輯器會出現此問題。作爲初學者,我建議你切換到iHaskell,它有一個非常簡單的界面和合理強大的編輯器功能。

問題是已明顯,如果你沒有使用這麼多不必要的parens。以下內容可以省略,有些可以用$代替。雖然我們的風格......

sumToN f x n -- checking ==1 is not safe in general 
    | n<=1  = f $ x 1 
    | otherwise = f x n + f x (n-1) 

facOfN = product [1..n] 

sineApprox x n = (-1)^n * x**(2*n+1)/facOfN (2*n+1) 

sine x = sumToN . sineApprox x 

在另一方面:在一般情況下,你應該總是使用類型簽名。這段代碼實際上有問題,因爲所有的計數器變量都是自動浮點的(就像其他所有的東西一樣)。他們應該真的是Int s,這需要在階乘&dagger中進行轉換;

sumToN :: Num n => (Int -> n) -> Int -> n 
sumToN f x n 
    | n<1  = 0 
    | otherwise = f x n + f x (n-1) 

facOfN :: Num n => Int -> n 
facOfN = product [1 .. fromIntegral n] 

sineApprox :: Fractional n => n -> Int -> n 
sineApprox x n = (-1)^n * x^(2*n+1)/facOfN (2*n+1) 

sine 
sine x = sumToN . sineApprox x 


&匕首; 順便說一句,明確使用階乘幾乎總是一個壞主意,因爲這些數字很快就會變得龐大。另外,你正在做很多重複的工作。隨着你的加入,更好的倍增!