解析 Haskell 中的字符 (――) 时出错

Error parsing a char (――) in Haskell

我正在编写一个解析器来使用 attoparsec 解析大量英文文本。到目前为止一切都很好,除了解析这个字符 "――"。我知道这只是 2 个破折号 "--"。奇怪的是,解析器在这段代码中捕获了它:

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

但在这种情况下不是:

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

我使用列表 specialChars 的原因是因为我有很多字符需要考虑并且我将它应用到多个案例中。对于输入,请考虑:"I am ――Walt Whitman._" 并且输出应该是 {"I", "am", "Walt", "Whiteman."} 我相信这主要是因为 "――" 不是 Char?我该如何解决?

一个Char是一个字符,句号。 ――是两个字符,所以是两个Char。您可以将任意多的 Char 装入一个 String,但您肯定不能将两个 Char 装入一个 Char.

由于 satisfy 一次考虑单个字符,如果您需要将两个字符的序列作为一个单元进行解析,这可能不是您想要的。 inClass 函数只产生一个字符谓词(inClass 部分应用于一个参数产生类型 Char -> Bool 的函数),因此 inClass "――" 与 [=23= 相同],这与 inClass ['―'] 相同,因为重复项无关紧要。那对你帮助不大。

考虑使用 string 代替 inClass 或与 inClass 结合使用,因为它旨在处理 字符序列 。例如,这样的内容可能更适合您的需求:

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