2016-04-27 4 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 ошибка является скорее более описательной: 'parse error (возможно, неправильный отступ или несогласованные скобки)' – 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 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 


& крестик; BTW, явно используя факториалы - это почти всегда плохая идея, так как числа быстро становятся невероятно большими. Кроме того, вы выполняете много дублирующихся действий. Лучше размножайтесь по мере добавления!

Смежные вопросы