正如評論中已經說過的,你已經忘記關閉一個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
&匕首;
順便說一句,明確使用階乘幾乎總是一個壞主意,因爲這些數字很快就會變得龐大。另外,你正在做很多重複的工作。隨着你的加入,更好的倍增!
'sineApprox'行末尾缺少括號。 –
這是擁抱嗎?在ghci中,錯誤更具描述性:'解析錯誤(可能是不正確的縮進或不匹配的括號)' – leftaroundabout