Parsing Haskell:当输入字符串为空时,如何停止Data.attoprasec.Char8.sebby?

Parsing Haskell:当输入字符串为空时,如何停止Data.attoprasec.Char8.sebby?,parsing,haskell,attoparsec,Parsing,Haskell,Attoparsec,我已经编写了以下Haskell代码 import Data.Attoparsec (Parser) import qualified Data.Attoparsec.Char8 as A import qualified Data.ByteString.Char8 as B someWithSep sep p = A.sepBy p sep 假设代码是这样工作的: main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "

我已经编写了以下Haskell代码

import Data.Attoparsec (Parser)
import qualified Data.Attoparsec.Char8 as A
import qualified Data.ByteString.Char8 as B

someWithSep sep p = A.sepBy p sep
假设代码是这样工作的:

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89"
Done "" [123,45,67,89]
但是,由于我在上面编写的代码中定义了someWithSep,我总是会得到以下行为:

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89"
Partial _
除非我提供损坏的条目:

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89f"
Done "f" [123,45,67,89]
我怎样才能纠正这个问题


多亏了reply

部分
构造函数并不表示失败,只是如果需要,解析可以继续。您应该获取部分项并将空的ByteString(根据文档:)提供给它,以获得最终结果

为了证明它是有效的:

> let A.Partial f = A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89" in f B.empty
Done "" [123,45,67,89]

当然,您可能希望在最后有一个case语句来处理其他情况。

attopassec接受多个部分的输入。其中一个将第一个片段提供给解析,然后将解析的结果提供给提要,然后将该结果和第三个片段再次提供给提要,依此类推

向解析器提供一个空字符串以标记输入的结束:

A.feed (A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89") B.empty
Done "" [123,45,67,89] 
或者使用Data.Attoparsec.Lazy,其中Lazy字符串为您处理输入结束:

import qualified Data.Attoparsec.Lazy as L
import qualified Data.Attoparsec.Char8 as A
import qualified Data.ByteString.Lazy.Char8 as B
L.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89"
Done "" [123,45,67,89] 

(另请参见)

附录:attoparsec中的
feed
函数也可用于随后提供空字符串,因此您也可以使用:
A.feed(A.parse(somewithstep A.skipSpace A.decimal)$B.pack“123 45 67 89”)B.empty