请帮助,我一直试图让这段代码工作,但我找不到错误。以下是我的代码
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)
非常感谢任何协助。
答案 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,明确使用阶乘几乎总是一个坏主意,因为这些数字很快就会变得非常庞大。此外,你正在做很多重复的工作。随着你的加入,更好地倍增!