【问题标题】:Parse error at end of "let" in Haskell file在 Haskell 文件中的“let”末尾解析错误
【发布时间】:2018-02-27 11:49:21
【问题描述】:

在这个 Haskell 代码中,你能在“b2”的末尾看到什么错误?我相信没有错误,但是文件Q3.hs中的这段代码:

let idPnumber a1 b2= take 3 a1 == take 3 b2

给出错误:

Q3.hs:1:45: error:
    parse error (possibly incorrect indentation or mismatched brackets)
  |
1 | let idPnumber a1 b2= take 3 a1 == take 3 b2 
  |                                             ^

【问题讨论】:

  • 显示完整的错误和完整的功能。
  • 完整的错误在这里:Q3.hs:1:45: error: parse error (可能不正确的缩进或不匹配的括号) 完整的代码/函数是我放在上面的那个
  • 我猜它缺少in 子句,但您应该提供完整的代码示例以便我们对其进行调试。
  • @HankySpanky 这绝对不是全部代码,因为顶层的 let 在 Haskell 98 或 2010 中会产生解析器错误。
  • 此代码可以在 ghci 中工作,但由于差异很小,因此不能在文件中工作。尝试删除let

标签: haskell parse-error


【解决方案1】:

如果您正在编译 Haskell 源文件,例如 Q3.hs,则程序“顶层”的函数定义需要具有如下语法:

idPnumber a1 b2= take 3 a1 == take 3 b2

没有任何let。相反,let 用于 函数中为表达式命名,如下所示:

idPnumber a1 b2 = let threeA1 = take 3 a1
                      threeB2 = take 3 b2
                  in  threeA1 == threeB2

and -- 在这种情况下 -- 必须后跟in 子句。 (还有一些其他方式可以使用let,不需要in,但这里不适用。)

由于您的文件中缺少 in 关键字,GHC 已经陷入了无可救药的困惑,并给您一个没有多大意义的错误消息。 (如果您添加了 in 子句,您仍然会收到一条错误消息,但它会说明 GHC 正在寻找“顶级声明”,这是一个类似于上面没有任何 let 关键字的定义.

请注意,您可以在 GHCi 交互式提示中像这样使用let,但这是因为交互式提示的行为与在文件中编译程序不同。

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多