Haskell:当输入String为空时如何停止Data.Attoparsec.Char8.sepBy?

Fop*_*tin 3 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
Run Code Online (Sandbox Code Playgroud)

代码假设以这种方式工作:

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89"
Done "" [123,45,67,89]
Run Code Online (Sandbox Code Playgroud)

但是因为我已经在上面编写的代码中定义了someWithSep,所以我总是得到以下行为:

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89"
Partial _
Run Code Online (Sandbox Code Playgroud)

除非我提供了损坏的条目:

main*> A.parse (someWithSep A.skipSpace A.decimal) $ B.pack "123 45  67 89f"
Done "f" [123,45,67,89]
Run Code Online (Sandbox Code Playgroud)

我怎么能纠正这个?

谢谢你的回复

Nei*_*own 5

Partial构造并不表示故障,只是如果你希望它是解析可以继续.您应该使用Partial项并将其提供给空的ByteString(根据文档:http://hackage.haskell.org/packages/archive/attoparsec/0.8.1.0/doc/html/Data-Attoparsec-Char8.html# t:结果)得到最终结果.

只是为了表明它有效:

> 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]
Run Code Online (Sandbox Code Playgroud)

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