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
相关产品推荐
相关产品推荐

