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

为何Parsec多解析器会终止解析?Haskell解析"Hello World"失败

Parsec解析"Hello World"失败的原因及解决办法

你的问题出在Parsec的<|>解析器组合子的行为上:它会优先尝试第一个解析器,只要匹配成功就不会再尝试后面的。

当输入是"Hello World"时,p1会先匹配开头的"Hello",匹配成功后直接返回结果,剩下的" World"没有被后续解析逻辑处理,因此触发unexpected whitespace(意外的空白字符)错误。

解决方法

有两种常见处理方式:

  1. 调换解析器顺序,把更长的匹配放在前面:
parser = p2 <|> p1

p1 = string "Hello"
p2 = string "Hello World"

这样会先尝试匹配完整的"Hello World",只有当匹配失败时才会尝试p1。

  1. 确保整个输入被完全解析,添加eof验证输入结束:
import Text.Parsec (eof)

parser = (p1 <|> p2) <* eof

p1 = string "Hello"
p2 = string "Hello World"

这种方式下,如果p1匹配后还有剩余输入(比如"Hello"后面的空格),会直接报错,避免只解析部分输入的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:14:54