我正在寻找对编译器错误消息The value of xyz is undefined here, so reference is not allowed.
以及 do-notation 的一些说明。我没有设法对这个例子进行足够的概括,我所能给出的只是我偶然发现这种行为的具体例子。对此感到抱歉。
使用purescript-parsing,我想编写一个接受嵌套多行注释的解析器。为简化示例,每个注释都以 开头(
,以 结尾,)
并且可以包含一个a
或另一个注释。一些例子:(a)
并((a))
接受()
,(a
或被foo
拒绝。
以下代码导致The value of comment is undefined here, so reference is not allowed.
该行出现错误content <- string "a" <|> comment
:
comment :: Parser String String
comment = do
open <- string "("
content <- commentContent
close <- string ")"
return $ open ++ content ++ close
commentContent :: Parser String String
commentContent = do
content <- string "a" <|> comment
return content
我可以通过在上面插入一行来消除错误,content <- string "a" <|> comment
据我所知,它根本不会改变生成的解析器:
commentContent :: Parser String String
commentContent = do
optional (fail "")
content <- string "a" <|> comment
return content
问题是:
- 这里发生了什么?为什么额外的线路有帮助?
- 什么是让代码编译的非 hacky 方法?