1
說我有一個attoparsec解析器,x
。將attoparsec解析器轉換爲解析器,如果消耗的字節數不是一定長度,則解析器失敗
我希望創造一個功能f :: Int -> Parser a -> Parser a
,這樣如果y = f n x
,則:
y
如果x
失敗y
如果x
成功,x
不消耗n
字節y
失敗,失敗否則成功
我該如何去做這件事?
說我有一個attoparsec解析器,x
。將attoparsec解析器轉換爲解析器,如果消耗的字節數不是一定長度,則解析器失敗
我希望創造一個功能f :: Int -> Parser a -> Parser a
,這樣如果y = f n x
,則:
y
如果x
失敗y
如果x
成功,x
不消耗n
字節y
失敗,失敗否則成功我該如何去做這件事?
您可以使用match實現它:
f n x = do
(bs, res) <- match x
guard (BS.length bs >= n)
return res
您應該檢查這與(<|>)
以可接受的方式把它大量使用之前進行交互。
在'binary'中,這個函數被封裝爲'isolate'。也許它更明智,因爲'binary'跟蹤消耗的字節數,但它作爲attoparsec API的一個很好的補充(用於標記而不是字節,因此Text不會計算字節)。 –