У меня есть раковина и вы хотите провести синтаксический анализ с помощью 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). –
Спасибо! Это может пригодиться! Но можете ли вы объяснить, почему мое решение не работает? Я не возражаю дважды. Я думал, что лефуры могут работать так. – Schoon
Не могли бы вы привести свой код в [автономный] (http://sscce.org/) пример с тестовым примером, показывающим проблему? –