【问题标题】:Syntax of If-Else in Haskell?Haskell中If-Else的语法?
【发布时间】:2015-02-18 13:01:14
【问题描述】:

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

【问题讨论】:

  • 在文本编辑器中编写代码并将其导入 GHCI 对我来说没有任何语法错误。您是否在 GHCI 中以交互方式输入此内容?
  • 我正在使用 Notepad++ 编写代码并使用 WinGHCi 执行它。

标签: haskell if-statement syntax


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 虽然这个答案没有错,但它并没有解决为什么原始程序无法编译的问题,它可能给人一种必须使用保护而不是 if/then/ 的印象其他在这里。
    • 好的,谢谢,我会澄清这是一个替代方案。
    【解决方案3】:

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

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

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

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

    编辑:不,事实证明我错了。我尝试了几种不同的if 的错误缩进,一切正常。我不知道你原来的问题是什么。 (可能是制表符?)

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

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

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

    【讨论】:

    • 进一步或在同一列。
    • 这不是真的,缩进在if 表达式中不起作用。
    • 非常感谢各位!你已经向我展示了如何使用模式保护以及如何在 Haskell 中正确缩进。
    • 布局块只出现在关键字doletofwhere之后,它们的作用是插入大括号和分号。 if 表达式的语法只是 "if expr then expr else expr",不涉及任何分号。有关布局的更多信息,请参阅haskell.org/onlinereport/lexemes.html#sect2.7
    • DoAndIfThenElse 背后的问题不是if 需要缩进(它不需要),而是do 需要缩进。
    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多