Haskell 为什么这是do符号中的解析错误?
考虑以下代码:Haskell 为什么这是do符号中的解析错误?,haskell,syntax,parse-error,let,do-notation,Haskell,Syntax,Parse Error,Let,Do Notation,考虑以下代码: foo = do let bar = do baz bar 它不在ghc第8版中解析。它抱怨包含baz的行。但是,此代码不会解析: foo = do let bar = do baz bar 我觉得这令人困惑。这两个版本之间的本质区别是什么?问题是在无人区的缩进放置baz。它的缩进程度不足以成为let表达式的一部分,但它的缩进程度太大,无法成为包含let表达式的do表达式的下一部分。问题是缩进将baz置于无人地带。它的缩进程度不足以成为le
foo = do
let bar = do
baz
bar
它不在ghc第8版中解析。它抱怨包含baz
的行。但是,此代码不会解析:
foo = do
let bar = do
baz
bar
我觉得这令人困惑。这两个版本之间的本质区别是什么?问题是在无人区的缩进放置
baz
。它的缩进程度不足以成为let
表达式的一部分,但它的缩进程度太大,无法成为包含let
表达式的do
表达式的下一部分。问题是缩进将baz
置于无人地带。它的缩进程度不足以成为let
表达式的一部分,但它的缩进程度太大,不足以成为包含let
表达式的do
表达式的下一部分。为什么两个空格不足以使它成为do
块的一部分?请注意,它不是let
的直接部分,因为没有给它赋值。@Turion Haskell的布局规则要求let
或的右侧上的所有内容至少缩进到左侧上图案的第一列。在第一个示例中,baz
没有缩进到bar
,这是不正确的,但在第二个示例中是。为什么两个空格不足以使其成为do
块的一部分?请注意,它不是let
的直接部分,因为没有给它赋值。@Turion Haskell的布局规则要求let
或的右侧上的所有内容至少缩进到左侧上图案的第一列。在第一个示例中,baz
没有缩进到bar
,这是不正确的,但在第二个示例中是正确的。