2017-02-02 1 views

Antwort

1

Sie treffen auf eine alte Version von pipes-attoparsec, die einer alten Version von pipes entspricht. Bei neueren Versionen würde etwas wie das erste Beispiel ohne eine Pipe geschrieben werden. Wir würden die parsed-Funktion verwenden, die einen Parser wiederholt anwendet, bis sie fehlschlägt und gute Parsing-Daten strömen.

{-# LANGUAGE OverloadedStrings #-} 
import Pipes 
import qualified Pipes.Prelude as P 
import Pipes.Attoparsec 
import Data.Attoparsec.Text 
import Data.Text (Text) 

data Name = Name Text deriving (Show) 

hello :: Parser Name 
hello = fmap Name $ "Hello " *> takeWhile1 (/='.') <* "." 

helloparses :: Monad m => Producer Text m r -> Producer Name m (Either (ParsingError, Producer Text m r) r) 
helloparses = parsed hello 

process txt = do 
    e <- runEffect $ helloparses txt >-> P.print 
    case e of 
    Left (err,rest) -> print err >> runEffect (rest >-> P.print) 
    Right()  -> return() 

input1, input2 :: Monad m => Producer Text m() 
input1 = each 
    [ "Hello Kate." 
    , "Hello Mary.Hello Jef" 
    , "f." 
    , "Hel" 
    , "lo Tom." 
    ] 
input2 = input1 >> yield "garbage" 

Dann sehen wir

-- >>> process input1 
-- Name "Kate" 
-- Name "Mary" 
-- Name "Jeff" 
-- Name "Tom" 

-- >>> process input2 
-- Name "Kate" 
-- Name "Mary" 
-- Name "Jeff" 
-- Name "Tom" 
-- ParsingError {peContexts = [], peMessage = "string"} 
-- "garbage" 

Das andere Prinzip Funktion pipes-attoparsec definiert ist nur parse. Dies konvertiert einen Attoparsec-Parser in einen Pipe-Parser, um ein Anfangssegment eines Produzenten zu parsen, der mit dem Parser übereinstimmt. Sie können über sie hier lesen http://www.haskellforall.com/2014/02/pipes-parse-30-lens-based-parsing.html

+0

Vielen Dank für Ihre Zeit nehmen Sie meine Frage zu beantworten. Es sieht so aus, als ob die Pipes-attoparsec in letzter Zeit dramatische Veränderungen erfahren hat. Das Tutorial, das ich genannt habe, ist völlig nutzlos und sogar störend. – user2812201