为什么这是 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
表达式的下一部分。
考虑以下代码:
foo = do
let bar = do
baz
bar
它在版本 8 ghc
中不解析。它抱怨包含 baz
的行。不过,这段代码确实解析了:
foo = do
let bar = do
baz
bar
我觉得这很混乱。两个版本的本质区别是什么?
问题是缩进将 baz
放在了 no-mans 区域。它缩进得不够远,无法成为 let
表达式的一部分,但它缩进得太远,无法成为包含 let
表达式的 do
表达式的下一部分。