1

我是新手 haskell,在学习 parsec lib 中举了一个例子:

nesting :: Parser Int
nesting = do{ char '('
            ; n <- nesting
            ; char ')'
            ; m <- nesting
            ; return (max (n+1) m)
            }
        <|> return 0  

那么 n 或 m 是什么?为什么 n 和 m 是 int 并且大于 0?

4

1 回答 1

3

Parsec 是一个单子解析库,因此您可能应该首先向自己介绍单子和 do 表示法的语法糖。

nesting是一个解析器,您可以将其视为具有类型结果的计算(monad)Int。每当您在 do 块中看到这样的代码n <- nesting时,这意味着运行 monad 嵌套并将结果绑定到n.

要查看此解析器的工作原理,请尝试手动运行它。例如使用字符串“ ()”。

它是这样的:

  • 在 do 块中尝试解析器,成功解析 ' (',递归运行解析器并将结果绑定到n.
    • 尝试 do 块中的解析器,解析 ' ' 失败(,尝试下一个解析器 ( return 0),它总是以 value 成功0
  • n现在的值为 0,因为这是递归运行解析器的结果。do 块中的下一个是解析器char ')',它成功了,再次递归调用解析器并将结果绑定到m. 与上面的结果相同mis 0

现在计算的整个结果max (n+1) m1

如您所见,这个解析嵌套括号,并且大致在顶层n保存'('解析的数量,而m保存')'解析的数量。

于 2011-03-23T10:07:59.333 回答