为什么在Haskell中正确解析下面的布局?

为什么在Haskell中正确解析下面的布局?,haskell,Haskell,我正在测试我对Haskell report()中布局解析函数的理解 我可以理解: 由于对齐良好,测试用例1将通过 测试用例2将失败,因为“a+b中”被视为模块级的新项目 然而,我不明白为什么测试用例3会被正确解析。因此,问题是: 为什么测试用例3会被正确解析? 测试用例3与解析函数L(参见)的LHS中的哪个模式匹配 -- test case 1 f_1 = let a = 1 b = 2 in a + b -- test case 2 f_2 = let a

我正在测试我对Haskell report()中布局解析函数的理解

我可以理解:

  • 由于对齐良好,测试用例1将通过
  • 测试用例2将失败,因为“a+b中”被视为模块级的新项目
然而,我不明白为什么测试用例3会被正确解析。因此,问题是:

为什么测试用例3会被正确解析? 测试用例3与解析函数L(参见)的LHS中的哪个模式匹配

-- test case 1
f_1 = let a = 1
          b = 2
      in a + b

-- test case 2
f_2 = let a = 1
          b = 2
in a + b

-- test case 3
f_3 = let a = 1
          b = 2
                     in a + b

测试用例3匹配解析错误(t)规则。由于中的标记在let块中的该点处不合法,因此在中的之前插入一个},以结束它


解析错误规则可能令人困惑,但它也非常灵活;使用它,您可以编写Haskell单行程序,其中很少包含任何显式的
{}

很棒的技巧。谢谢你证实我的猜测。现在我正在a+b中编写
f_4=let a=1\n b=2
,它工作得很顺利。你也能解释一下如何让x=e;是否解析e'中的y=x?我发现很难理解报告中的解释“注1实现了一项功能,即布局处理可能会因分析错误而过早停止。”。@modeler。我怀疑这是“Note5Implements…”的拼写错误,因为Note5解释了解析错误(t)规则。我看到自从哈斯克尔98报告以来一直是这样。(1.4报告没有那么多细节。)@modeller无论如何,
{
是由注释1中引用的规则之一插入的,但是
}
是由注释5中引用的解析错误(t)规则插入的。我明白了。谢谢你的评论。