Frage

attoparsec wurde zum Parsen einer Datei mir vorgeschlagen, jetzt muss ich zu verstehen, wie es zu benutzen; jemand hat mir dieses Stück Code:

#

type Environment = M.Map String String 
import Data.Attoparsec (maybeResult)
import qualified Data.Attoparsec.Char8 as A
import qualified Data.ByteString.Char8 as B
environment :: A.Parser Environment
environment = M.fromList <$> A.sepBy entry A.endOfLine
parseEnvironment = maybeResult .flip A.feed B.empty . A.parse environment
spaces = A.many $ A.char ' '
entry = (,) <$> upTo ':' <*> upTo ';'
upTo delimiter = B.unpack <$> A.takeWhile (A.notInClass $ delimiter : " ")
                      <* (spaces >> A.char delimiter >> spaces)

das funktioniert sehr gut, aber ich weiß nicht, warum: was der Grund Flip zu verwenden, ist es nicht einfacher, das Argument von A.feed in einer anderen Reihenfolge zu setzen? und warum gibt es B.empty? gibt es einige Tutorial über, dass ich studieren? Vielen Dank im Voraus

War es hilfreich?

Lösung

Es ist eine Erklärung für die Notwendigkeit von feed in den Antworten auf diese Frage Stackoverflow . Als Bryan O'Sullivan (der Schöpfer von Attoparsec) sagt es:

Wenn Sie schreiben einen attoparsec Parser, dass Verbraucht so viel Input wie möglich bevor ein Fehler, müssen Sie das sagen, Teiler, wenn die Fortsetzung Sie haben das Ende Ihrer Eingabe erreicht.

Sie können dies tun, indem sie eine leere bytestring Fütterung.

Ich gebe zu, dass ich den Code in Frage geschrieben, und ich habe eigentlich nicht pointfree in diesem Fall verwendet werden. Einfache Zusammensetzung macht nur Sinn für mich hier: Sie den Parser (A.parse environment) laufen, können Sie es sagen, du bist fertig (flip A.feed B.empty), und Sie konvertieren zu einem Maybe als eine Art Grundfehlerbehandlung (maybeResult). Meiner Meinung nach fühlt sich diese sauberer als die spitze Version:

parseEnvironment b = maybeResult $ A.feed (A.parse environment b) B.empty

Der Rest ist Ich denke, ziemlich idiomatische applicative Parsing , obwohl ich bin mir nicht sicher, warum ich gebraucht >> statt *> haben würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top