无法理解 Haskell 程序的编译器错误



我正在开发一个大型的Haskell程序,所以我只包含在这里似乎相关的代码,以使问题更清晰。 如果我应该包括更多,请发表评论。

编译时,我只收到一条错误消息:"解析错误(可能是不正确的缩进或不匹配的括号(">

这里有一些没有错误的代码(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) 

这是一个缩进问题。该块

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的目的是将块拆分为条目,并且缩进使得只有一个条目。所以,我们用两件事来相互抵消。

缩进错误与do块有关。尝试在do后缩进。像这样:

varDeclStmt = do
                keyword "var" >>
                expr >>= s -> 
                symbol "=" >>
                expr >>= e ->
                return (VarDecl s e)

让我知道这是否有效。

相关内容

  • 没有找到相关文章

最新更新