我一直在寻找其他类似的问题,但我仍然无法解决这个问题。我会先说这是,这是作业,但我不知道我哪里错了。任务是重写我们给出的递归算法,如果n为0则返回1,如果n小于5则返回n,否则它在这里执行最后一行代码:
alg n = if (n == 0)
then 1
else if (n<5)
then n
else alg(n-1) * alg(n-2) * alg(n-3) * alg(n-4)
我得到的错误是WinGHCi中的解析错误(可能是错误的缩进或括号不匹配)。我已经查了很多关于如何在Haskell中正确构造if语句但仍然是初学者的文章,所以我不知道我哪里出错了。如果有人能够告诉我哪些是不正确的以避免将来的错误,我将非常感激。
答案 0 :(得分:4)
您单独编写的行没有任何问题,因为您可以通过将它们复制到新的Haskell源文件中来检查。如果GHC在其中一行上报告错误,那么真正的错误可能就在这些行之前,可能是一个不匹配的括号,或者if-then没有其他或类似的东西。
答案 1 :(得分:3)
使用 guards 可以考虑另一种(可以说是更简洁的)方法:
alg n
| n == 0 = 1
| n < 5 = n
| otherwise = alg(n-1) * alg(n-2) * alg(n-3) * alg(n-4)
答案 2 :(得分:-3)
答案就在错误信息中:你的缩进是错误的。具体来说,你写了
else if ...
then ...
else ...
then
和else
关键字需要比匹配的if
关键字缩进更多:
else if ...
then ...
else ...
编辑:不,它转过来我错了。我尝试了if
的几个不同的错误缩写,一切正常。我不知道你原来的问题是什么。 (制表符,也许?)
无论如何,正如@vikingsteve正确地指出的那样,在这种情况下你可以用模式保护做得更好:
alg n
| condition1 = ...
| condition2 = ...
| condition3 = ...
| condition4 = ...
在可能的情况下以这种方式执行通常更具可读性。 (当然,这并不总是那么容易......)