Haskell 秒差距问题

发布于 2024-10-25 19:35:08 字数 310 浏览 2 评论 0原文

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

I am newbie haskell and in lernning parsec lib
a example :

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

so what's n or m? why n and m is int and greater than 0?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秋叶绚丽 2024-11-01 19:35:08

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

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

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

它是这样的:

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

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

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

Parsec is a monadic parsing library, so you probably should first introduce yourself to monads and the syntactic sugar that is the do notation.

nesting is a parser which you can see as a computation (monad) with a result of type Int.
Whenever you see code like this n <- nesting in a do block, it means run the monad nesting and bind the result to n.

To see how this parser works try running it by hand. For example use the string "()".

It goes like this:

  • Tries the parser in the do block, succeeds parsing '(', runs the parser recursively and binds the result to n.
    • Tries the parser in the do block, fails parsing '(', tries the next parser (return 0) which always succeeds with the value 0.
  • n now has the value 0, because that was the result of running the parser recursively. Next in the do block is the parser char ')', it succeeds, calls the parser again recursively and binds the result to m. Same as above the result in m is 0.

Now the whole result of the computation is max (n+1) m which is 1.

As you can see this parses nested parenthesis, and roughly at the top level n holds the number of '(' parsed, while m holds the number of ')' parsed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文