函数式编程中的自定义正弦函数

Custom sine function in 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)

如有任何帮助,我们将不胜感激。

如评论中所述,您忘记关闭括号。它会像这样工作:

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

另一个注意事项:通常,您应该始终使用类型签名。这段代码实际上有问题,因为所有计数器变量都是自动浮点数(就像其他所有内容一样)。它们实际上应该是 Ints,这需要在阶乘中进行转换:

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


顺便说一句,明确地使用阶乘几乎总是一个坏主意,因为数字很快就会变得非常庞大。另外,您正在做很多重复工作。最好边加边乘!