Parsing 此处未定义x的值,因此不允许使用此引用

Parsing 此处未定义x的值,因此不允许使用此引用,parsing,recursion,purescript,Parsing,Recursion,Purescript,我编写了一个非常简单的解析器组合器库,它似乎可以正常工作 然后我尝试用这个库为json编写解析器。json解析器的代码如下- json的语法是递归的- data JsonVal = JsonInt Int | JsonString String | JsonBool Boolean | JsonObj (List (Tuple String JsonVal)) 这意味着json对象的解析器必须再次调用jsonVal的解析器。jsonObj解析器的代码如下所示-

我编写了一个非常简单的解析器组合器库,它似乎可以正常工作

然后我尝试用这个库为json编写解析器。json解析器的代码如下-

json的语法是递归的-

data JsonVal
    = JsonInt Int
    | JsonString String
    | JsonBool Boolean
    | JsonObj (List (Tuple String JsonVal))
这意味着json对象的解析器必须再次调用jsonVal的解析器。jsonObj解析器的代码如下所示-

jsonValParser
    = jsonIntParser <|> jsonBoolParser <|> jsonStringParser <|> jsonObjParser

propValParser :: Parser (Tuple String JsonVal)
propValParser = do
    prop <- stringLitParser
    _ <- symb ":"
    val <- jsonValParser
    pure (Tuple prop val)

listOfPropValParser :: Parser (List (Tuple String JsonVal))
listOfPropValParser = sepBy propValParser (symb ",")


jsonObjParser :: Parser JsonVal
jsonObjParser = do
    _ <- symb "{"
    propValList <- listOfPropValParser
    _ <- symb "}"
    pure (JsonObj propValList)
但是当我尝试构建它时,我得到了以下错误-这里未定义propValParser的值。所以这里不允许这个引用

我在stackoverflow上发现了类似的问题,但无法理解为什么会发生错误,或者我应该如何重构代码,以便它能够处理从jsonValParser到propValParser的递归引用

jsonValParser = do
    _ <- pure 1
    jsonIntParser <|> jsonBoolParser <|> jsonStringParser <|> jsonObjParser

如有任何帮助,将不胜感激。

请参阅类似案例-您需要使用修复功能,或引入Unit->。。。在解析器前面的某个地方打破循环定义。

我通过将抛出错误的块包装到do块中,并用noop-

listOfPropValParser :: Parser (List (Tuple String JsonVal))
listOfPropValParser = do
    _ <- pure 1 -- does nothing but defer the execution of the second line
    sepBy propValParser (symb ",")
必须对jsonValParser执行同样的操作

jsonValParser = do
    _ <- pure 1
    jsonIntParser <|> jsonBoolParser <|> jsonStringParser <|> jsonObjParser

其思想是延迟代码的执行,这可能导致循环依赖。添加的行,fix做什么?它是如何打破这个循环的?为什么循环定义是个问题?在我的解析器库中,我有另一个循环定义的例子,用于定义许多和许多组合符-。为什么这不是一个问题?可能重复的可能,但我认为代码看起来不同。而且,我不明白这种模式不被允许的原因。