gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:10:44 26 4
gpt4 key购买 nike

我正在处理一个大型 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)

最佳答案

这是一个缩进问题。 block

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">> 无效。

请注意,进一步(或更少)缩进整个 block 不会改变它的解析方式。

最简单的修复是完全删除do,这样下面的文本就不会被解析为一个 block ,因此它不会被拆分成单独的条目,而是被解析为好像在一个单独的条目上行。

否则,您可以切换到正确的do 表示法

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

或者(最坏的解决方案),使 do block 成为单项 block ,使 block 缩进多于第一行,如下所示

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

不过,上面的解决方案很愚蠢,因为 do 的目的是将 block 拆分为条目,并且进行缩进以便只有一个条目。所以,我们用两种东西相互抵消。

关于haskell - 无法理解 Haskell 程序的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47299906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com