在Haskell文件中“let”结束时解析错误

时间:2018-02-27 11:49:22

标签: haskell parse-error

在这个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 
  |                                             ^

1 个答案:

答案 0 :(得分:0)

如果要编译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

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

由于您的文件中缺少in关键字,因此GHC已经无可救药地混淆了,并且给了您一条没有多大意义的错误消息。 (如果你添加了一个in子句,你仍然会收到一条错误消息,但它会解释GHC正在寻找一个“顶级声明”,这个定义类似于上面没有任何{{ 1}}关键字。

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