关于Haskell Megaparsec库中many函数行为的疑问
Megaparsec中
many函数的行为解析 核心原因在于Megaparsec区分消耗输入的失败和未消耗输入的失败,many的行为完全依赖于内部解析器的失败类型:
- 当内部解析器未消耗任何输入就失败时,
many会停止尝试,返回空列表。 - 当内部解析器消耗了部分输入后失败时,
many会将这个失败直接抛出,导致整个解析报错。
逐个分析你的测试用例:
many (string "a" >> string "b")解析"ac"- 首先执行
string "a",成功消耗了第一个字符'a'。 - 接着执行
string "b",尝试匹配下一个字符'c'失败,此时内部解析器是消耗输入后失败的。 many遇到这种情况不会停止,而是将失败向上传递,所以整个解析报错。
- 首先执行
many (string "a" <> string "b")解析"ac"- Megaparsec中
<>对解析器的作用是顺序组合(和>>逻辑一致,只是结果会做Monoid拼接),执行流程和第一个用例完全相同:先消耗'a',再匹配'b'失败,属于消耗输入后的失败,因此many抛出错误。
- Megaparsec中
many (string "ab")解析"ac"string "ab"尝试匹配输入开头的两个字符,发现第一个字符是'a'但第二个是'c',无法匹配完整的"ab",此时string "ab"会**回滚输入(不消耗任何字符)**然后失败。many遇到这种未消耗输入的失败,就会停止尝试,返回空列表[]。
内容的提问来源于stack exchange,提问作者Vincent Moreau
相关产品推荐
相关产品推荐

