You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Haskell Megaparsec库中many函数行为的疑问

Megaparsec中many函数的行为解析

核心原因在于Megaparsec区分消耗输入的失败和未消耗输入的失败,many的行为完全依赖于内部解析器的失败类型:

  • 当内部解析器未消耗任何输入就失败时,many会停止尝试,返回空列表。
  • 当内部解析器消耗了部分输入后失败时,many会将这个失败直接抛出,导致整个解析报错。

逐个分析你的测试用例:

  1. many (string "a" >> string "b") 解析 "ac"

    • 首先执行string "a",成功消耗了第一个字符'a'。
    • 接着执行string "b",尝试匹配下一个字符'c'失败,此时内部解析器是消耗输入后失败的。
    • many遇到这种情况不会停止,而是将失败向上传递,所以整个解析报错。
  2. many (string "a" <> string "b") 解析 "ac"

    • Megaparsec中<>对解析器的作用是顺序组合(和>>逻辑一致,只是结果会做Monoid拼接),执行流程和第一个用例完全相同:先消耗'a',再匹配'b'失败,属于消耗输入后的失败,因此many抛出错误。
  3. many (string "ab") 解析 "ac"

    • string "ab"尝试匹配输入开头的两个字符,发现第一个字符是'a'但第二个是'c',无法匹配完整的"ab",此时string "ab"会**回滚输入(不消耗任何字符)**然后失败。
    • many遇到这种未消耗输入的失败,就会停止尝试,返回空列表[]。

内容的提问来源于stack exchange,提问作者Vincent Moreau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:12:36