Die Pipes.Aeson Bibliothek setzt die folgende Funktion:Streaming Parsen von JSON in Haskell mit Pipes.Aeson
decode :: (Monad m, ToJSON a) => Parser ByteString m (Either DecodingError a)
Wenn ich evalStateT mit diesem Parser und ein Datei-Handle als Argument verwenden, ein einzelnes JSON-Objekt ist Aus der Datei lesen und analysieren.
Das Problem ist, dass die Datei mehrere Objekte (alle vom gleichen Typ) enthält und ich möchte sie falten oder reduzieren, wie sie gelesen werden.
Pipes.Parse bietet:
foldAll :: Monad m => (x -> a -> x) -> x -> (x -> b) -> Parser a m b
aber wie Sie dies gibt einen neuen Parser zu sehen - ich kann nicht denken Sie an einen Weg, um den ersten Parser als Argument zu liefern.
Es sieht aus wie ein Parser ist eigentlich ein Produzent in einem StateT Monade-Transformator. Ich habe mich gefragt, ob es eine Möglichkeit gibt, den Producer aus dem StateT zu extrahieren, so dass evalStateT auf den foldAll Parser und der Producer aus dem decode Parser angewendet werden kann.
Dies ist jedoch wahrscheinlich völlig falsch Ansatz.
Meine Frage, kurz:
Beim Parsen einer Datei mit Pipes.Aeson, was ist der beste Weg, um alle Objekte in der Datei zu falten?
Sie können auch zoomen decodiert (foldAll Schritt beginnen getan) ' –
@GabrielGonzalez Ah ja, ich habe vergessen, man kann auch' Zoom' verwenden, um Linsen auf 'Parser's anzuwenden. – danidiaz
@GabrielGonzalez Es scheint auch, dass die Verwendung von "Zoom decodiert ..." Parsing-Fehler leichter zu handhaben macht. – danidiaz