为什么这是 do 表示法中的解析错误?

Why is this a parse error in do notation?

考虑以下代码:

foo = do
  let bar = do
    baz
  bar

它在版本 8 ghc 中不解析。它抱怨包含 baz 的行。不过,这段代码确实解析了:

foo = do
  let bar = do
      baz
  bar

我觉得这很混乱。两个版本的本质区别是什么?

问题是缩进将 baz 放在了 no-mans 区域。它缩进得不够远,无法成为 let 表达式的一部分,但它缩进得太远,无法成为包含 let 表达式的 do 表达式的下一部分。