在Haskell中解析char( - )时出错

时间:2018-05-06 04:00:05

标签: haskell attoparsec

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

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?我该如何解决?

1 个答案:

答案 0 :(得分:4)

Char是一个字符,句号。 ――是两个字符,因此它是两个Char。您可以根据需要将CharString放入Char,但是当然不能将两个Char放入一个satisfy

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

考虑使用inClass代替wordSeparator :: Parser () wordSeparator = many1 (space <|> string "――" <|> satisfy (inClass "?!,:")) >> pure () 或与SELECT [GOODS_TYPE] = COALESCE([_TYPE_NAME], 'GRAND_TOTAL'), b.GOODS_CODE,b.GOODSNAME,a.CURRENCY,a.CUSTOMER_CD, a.INVOICE_DATE,[QUANTITY] = SUM([QTY]) From [DVHead] a inner join [DVRecords] b on a.DELIVERYNO=b.DELIVERYNO WHERE a.INVOICE_DATE='2018-05-04' GROUP BY GROUPING SETS(([_TYPE_NAME],[GOODS_CODE],[GOODSNAME], [CURRENCY],[CUSTOMER_CD],[INVOICE_DATE]),([_TYPE_NAME]),()); 结合使用,因为它旨在处理字符的序列。例如,这样的事情可能更适合您的需求:

cellForRowAtIndexPath