无法理解 Haskell 程序的编译器错误
Compiler error for Haskell program not understood
我正在开发一个大型 Haskell 程序,因此我只包含此处似乎相关的代码以使问题更清楚。如果我应该包括更多,请发表评论。
编译时,我只收到一条错误消息:"parse error (possibly incorrect indentation or mismatched brackets)"
这是一些没有错误的代码 (printStmt) 和一个非常相似的部分 (VarDeclStmt),错误指向行读取 "expr >>= \s ->"。我不明白为什么一个会没事而另一个会导致问题。它们有什么不同?
printStmt =
keyword "print" >>
expr >>= \e ->
symbol ";" >>
return (Print e)
varDeclStmt = do
keyword "var" >>
expr >>= \s -> --ERROR
symbol "=" >>
expr >>= \e ->
return (VarDecl s e)
缩进错误与 do
块有关。尝试在 do
之后缩进。类似于:
varDeclStmt = do
keyword "var" >>
expr >>= \s ->
symbol "=" >>
expr >>= \e ->
return (VarDecl s e)
如果可行,请告诉我。
这是一个缩进问题。区块
varDeclStmt = do
keyword "var" >>
expr >>= \s -> --ERROR
symbol "=" >>
expr >>= \e ->
return (VarDecl s e)
解析为
varDeclStmt = do
{ keyword "var" >>
; expr >>= \s -> --ERROR
; symbol "=" >>
; expr >>= \e ->
; return (VarDecl s e)
}
这是无稽之谈,因为第一个条目 keyword "var" >>
无效。
请注意,进一步(或更少)缩进整个块不会改变它的解析方式。
最简单的解决方法是完全删除 do
,这样下面的文本就不会被解析为一个块,因此它不会被拆分成单独的条目,而是被解析为好像在一行上.
否则,您可以切换到正确的 do
表示法
varDeclStmt = do
keyword "var"
s <- expr
symbol "="
e <- expr
return (VarDecl s e)
或(最坏的解决方案),使 do
块成为单项块,使块缩进超过第一行,如 follos
varDeclStmt = do
keyword "var" >>
expr >>= \s ->
symbol "=" >>
expr >>= \e ->
return (VarDecl s e)
不过,上述解决方案很愚蠢,因为 do
的目的是将块拆分为多个条目,并且进行缩进以便只有一个条目。所以,我们用两种东西相互抵消。
我正在开发一个大型 Haskell 程序,因此我只包含此处似乎相关的代码以使问题更清楚。如果我应该包括更多,请发表评论。
编译时,我只收到一条错误消息:"parse error (possibly incorrect indentation or mismatched brackets)"
这是一些没有错误的代码 (printStmt) 和一个非常相似的部分 (VarDeclStmt),错误指向行读取 "expr >>= \s ->"。我不明白为什么一个会没事而另一个会导致问题。它们有什么不同?
printStmt =
keyword "print" >>
expr >>= \e ->
symbol ";" >>
return (Print e)
varDeclStmt = do
keyword "var" >>
expr >>= \s -> --ERROR
symbol "=" >>
expr >>= \e ->
return (VarDecl s e)
缩进错误与 do
块有关。尝试在 do
之后缩进。类似于:
varDeclStmt = do
keyword "var" >>
expr >>= \s ->
symbol "=" >>
expr >>= \e ->
return (VarDecl s e)
如果可行,请告诉我。
这是一个缩进问题。区块
varDeclStmt = do
keyword "var" >>
expr >>= \s -> --ERROR
symbol "=" >>
expr >>= \e ->
return (VarDecl s e)
解析为
varDeclStmt = do
{ keyword "var" >>
; expr >>= \s -> --ERROR
; symbol "=" >>
; expr >>= \e ->
; return (VarDecl s e)
}
这是无稽之谈,因为第一个条目 keyword "var" >>
无效。
请注意,进一步(或更少)缩进整个块不会改变它的解析方式。
最简单的解决方法是完全删除 do
,这样下面的文本就不会被解析为一个块,因此它不会被拆分成单独的条目,而是被解析为好像在一行上.
否则,您可以切换到正确的 do
表示法
varDeclStmt = do
keyword "var"
s <- expr
symbol "="
e <- expr
return (VarDecl s e)
或(最坏的解决方案),使 do
块成为单项块,使块缩进超过第一行,如 follos
varDeclStmt = do
keyword "var" >>
expr >>= \s ->
symbol "=" >>
expr >>= \e ->
return (VarDecl s e)
不过,上述解决方案很愚蠢,因为 do
的目的是将块拆分为多个条目,并且进行缩进以便只有一个条目。所以,我们用两种东西相互抵消。