Haskell中If-Else的语法?

时间:2015-02-18 13:01:14

标签: haskell if-statement syntax

我一直在寻找其他类似的问题,但我仍然无法解决这个问题。我会先说这是,这是作业,但我不知道我哪里错了。任务是重写我们给出的递归算法,如果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语句但仍然是初学者的文章,所以我不知道我哪里出错了。如果有人能够告诉我哪些是不正确的以避免将来的错误,我将非常感激。

3 个答案:

答案 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 ...

thenelse关键字需要比匹配的if关键字缩进更多:

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

编辑:不,它转过来我错了。我尝试了if的几个不同的错误缩写,一切正常。我不知道你原来的问题是什么。 (制表符,也许?)

无论如何,正如@vikingsteve正确地指出的那样,在这种情况下你可以用模式保护做得更好:

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

在可能的情况下以这种方式执行通常更具可读性。 (当然,这并不总是那么容易......)