【问题标题】:haskell parsec problem哈斯克尔秒差距问题
【发布时间】:2011-03-23 09:15:01
【问题描述】:

我是新手 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?

【问题讨论】:

  • 我明白了!为每个 '(' 返回 (n+1) ,所以 n 是 '(' 级别
  • 顺便说一句,你既不需要花括号也不需要 ; 来表示 do-notation。

标签: haskell parsec


【解决方案1】:

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

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

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

是这样的:

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

现在整个计算结果是max (n+1) m,即1

正如你所看到的,它解析嵌套括号,并且大致在顶层n 包含已解析的'(' 的数量,而m 包含已解析的')' 的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多