すでにコメントの中で述べたように、あなたは括弧を閉じることを忘れてしまった。それはそのように動作します:
sineApprox x n = ((-1)^n) * ((x ** (2*n+1))/facOfN(2*n+1))
この問題は、より良いテキストエディタで明らかでした。初心者であれば、非常にシンプルなインターフェースを持ちながら、かなり強力なエディタ機能を持っているiHaskellに切り替えることをお勧めします。
問題がでもであり、あまりにも多くの不必要な括弧を使用していない場合は明らかです。次のように省略すると、$
に置き換えることができます。私たちはスタイルに慣れています...
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
である必要があります。これは階乗の変換を必要とします。&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