싱크대가있어서 attoparsec을 사용하여 파싱을하고 싶습니다. Partial
결과가 발생합니다. 그래서 나는 단지 leftover
을 사용하여 불충분 한 내용을 다시 업스트림에 넣을 수있을 것이라고 생각 했으므로 나중에 더 많이 추가 될 것입니다. 그러나 내가 바라던대로 새로운 내용이 추가되지 않습니다. 이 문제를 해결하는 방법에 대한 제안은 매우 감사하겠습니다. 감사!남은 부분이있는 도관 싱크
{-# LANGUAGE OverloadedStrings #-}
import Control.Monad.IO.Class (liftIO)
import Data.Conduit
import qualified Data.Conduit.List as CL
import qualified Data.ByteString.Char8 as BS
import Data.Attoparsec.Char8
main = (CL.sourceList [BS.pack "foo", BS.pack "bar"]) $$ sink -- endless loop
-- this works:
-- main = (CL.sourceList [BS.pack "foobar"]) $$ sink
sink :: Sink BS.ByteString IO()
sink = awaitForever $ \str -> do
liftIO $ putStrLn $ BS.unpack str -- debug, will print foo forever.
case (parse (string "foobar") str) of
Fail _ _ _ -> do
liftIO $ putStr $ "f: " ++ BS.unpack str
sink
Partial _ -> do
leftover str
sink
Done rest final -> do
liftIO $ putStr $ "d: " ++ show final ++ " // " ++ show rest
sink
['Data.Conduit.Attoparsec'] (https://hackage.haskell.org/package/conduit-extra-1.1.4.1/docs/Data-Conduit-Attoparsec.html)도 참조하십시오. –
감사합니다. 이것은 적합 할 수도 있습니다! 하지만 내 솔루션이 왜 작동하지 않는지 설명 할 수 있습니까? 두 번 파싱하는 것을 신경 쓰지 않습니다. lewvers는 그런 식으로 작동 할 수도 있다고 생각했습니다. – Schoon
코드를 테스트 케이스와 함께 [자체 포함] (http://sscce.org/) 예제로 만드실 수 있습니까? –