Haskell 中 If-Else 的语法?

Syntax of If-Else in Haskell?

我一直在看其他类似的问题,但我仍然无法解决这里的问题。我会先说是的,这是家庭作业,但我现在不知道自己哪里错了。任务是重写我们得到的递归算法,即 returns 1 如果 n 为 0,n 如果 n 小于 5,否则执行最后一行代码:

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 语句的文章,但我仍然是初学者,所以我不知道我哪里出错了。如果有人能告诉我其中不正确的地方以避免以后的错误,我将不胜感激。

可以考虑另一种(可以说更简洁)方法,使用 guards:

alg n
    | n == 0 = 1 
    | n < 5 = n 
    | otherwise = alg(n-1) * alg(n-2) * alg(n-3) * alg(n-4)

答案就在错误消息中:您的缩进有误。具体来说,你写了

else if ...
  then ...
  else ...

thenelse 关键字需要比匹配的 if 关键字进一步缩进:

else if ...
       then ...
       else ...

编辑: 不对,原来我错了。我已经尝试了 if 的几个不同的错误缩进,并且一切正常。我不知道你原来的问题是什么。 (可能是制表符?)

无论如何,正如@vikingsteve 正确指出的那样,在这种情况下,您可以使用模式守卫做得更好:

alg n
    | condition1 = ...
    | condition2 = ...
    | condition3 = ...
    | condition4 = ...

如果可能的话,这样做通常更具可读性。 (这并不总是那么容易,当然...)

您单独编写的行没有任何问题,因为您可以通过将它们复制到新的 Haskell 源文件中来检查。如果 GHC 在这些行之一上报告错误,那么真正的错误可能就在这些行之前,可能是不匹配的括号或 if-then 没有其他或类似的东西。