功能编程中的自定义正弦函数

时间:2016-04-27 14:37:45

标签: haskell sine

请帮助,我一直试图让这段代码工作,但我找不到错误。以下是我的代码

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)

非常感谢任何协助。

1 个答案:

答案 0 :(得分:3)

正如评论中已经说过的那样,你忘了关闭一个人。它会像那样工作:

lambda

请注意,使用更好的文本编辑器会出现此问题。作为初学者,我建议您切换到iHaskell,它具有非常简单的界面和相当强大的编辑功能。

如果你没有使用过这么多不必要的问题,那么的问题会很明显。以下可以省略,有些可以用partial替换。虽然我们风格迥异......

sineApprox x n = ((-1) ^ n) * ((x ** (2*n+1))/facOfN(2*n+1))

另一方面:通常,您应该始终使用类型签名。这段代码实际上有问题,因为所有的计数器变量都是自动浮点(就像其他所有的一样)。它们应该是$ s,这需要在factorial 中进行转换:

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

<小时/> BTW,明确使用阶乘几乎总是一个坏主意,因为这些数字很快就会变得非常庞大。此外,你正在做很多重复的工作。随着你的加入,更好地倍增!