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

Haskell中attoparsec解析特殊字符「――」出错求助

解决attoparsec无法匹配「――」的问题

我猜你大概率是在这里踩了一个Haskell的小语法/逻辑坑,咱们一步步理清楚:

首先看你两种写法的核心差异:

  • 第一种写法里,inClass "――?!,:"用双引号包裹了「――」,这在Haskell里是字符串(也就是[Char]类型),相当于把两个独立的「―」字符都加入了匹配集合,所以能正常捕获。
  • 第二种写法里,你写了specialChars = ['――', '?', '!', ',', ':'],这里的问题出在'――':Haskell的单引号'只能用来表示单个Char类型的值,你用它包裹两个字符的「――」,要么会直接编译报错,要么实际被解析成了某个你预期之外的字符,导致inClass根本没把你要匹配的字符加入集合,自然就捕获不到了。

修复方案

有两种简单的修复方式,选哪种都可以:

方案1:把specialChars定义为字符串

直接和第一种写法对齐,用双引号定义specialChars,这样inClass能正确识别所有要匹配的字符:

specialChars = "――?!,:"
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass specialChars)) >> pure ()

方案2:拆分字符列表的元素

如果你坚持要用字符列表,确保每个元素都是单个Char,把「――」拆成两个独立的单字符元素:

specialChars :: [Char]
specialChars = ['—', '—', '?', '!', ',', ':']
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass specialChars)) >> pure ()

额外小技巧

如果你不确定输入里的「――」到底是一个还是两个字符,可以在GHCi里验证:

> length "――"  -- 查看这个字符串包含几个字符
> map ord "――" -- 查看每个字符的Unicode编码,确认实际值

这样能帮你精准匹配输入文本里的实际字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:35:52