2016-04-27 7 views
0

私はこのコードを動作させようとしていますが、エラーを見つけることはできません。以下は私のコードですFunctional Programmingのカスタムサイン関数

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

すでにコメントの中で述べたように、あなたは括弧を閉じることを忘れてしまった。それはそのように動作します:

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 


&短剣。 ところで、明示的に階乗を使用することは、数字がすぐに扱いにくいほど大きくなるので、ほとんど常に悪い考えです。また、あなたは重複した作業をたくさん行っています。あなたが一緒に追加すると倍増!

関連する問題