Haskell:data.attoparsec.char8.sepby入力文字列が空のときに停止する方法は?
-
27-09-2019 - |
質問
次の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]
どうすればこれを修正できますか?
返信に感謝します
解決
Partial
コンストラクターは故障を示していません。単に、それを望むなら解析が続くことができるということです。部分的なアイテムを取り、空のバイテストリングに供給する必要があります(ドキュメントに従って: http://hackage.haskell.org/packages/archive/attoparsec/0.8.1.0/doc/html/data-attoparsec-char8.html#t:result)最終結果を取得します。
それが機能することを示すために:
> 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]
もちろん、おそらく他のケースを処理するために最終的にケースステートメントが必要です。
他のヒント
attoparsecは複数のピースで入力を受け入れます。 1つは最初の作品を与えます 解析, 、次に結果を与えます 解析 そして、2番目の作品 餌, 、次にその結果を与え、3番目のピースに 餌 繰り返しますが、
入力の終わりをマークするために、空の文字列をパーサーに送信します。
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を使用します。ここで、怠zyな文字列はあなたのために入力の終わりを処理します。
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]
(参照も参照 この関連するスタックオーバーフローの質問)
所属していません StackOverflow