Ich habe diesen Parsec Parser:Warum läuft Parsec nicht zurück, wenn ein Teil des Parsers erfolgreich ist und der Rest fehlschlägt?
a = optionMaybe $ do {try $ spaceornull *> string "hello";string "No"}
Wo spaceornull
ist ((:[]) <$> try space) <|> string ""
Als ich mit Eingang testen "" Ich bekomme:
Left (Zeile 1, Spalte 2):
unerwartetes Ende des Eingangs
erwartet "Hallo"
ich das nicht verstehen, sollte spaceornull *> string "hello"
scheitern, weil es keine „Hallo“, dann mit try
Parsec ziehen zurück und jetzt gibt es keinen verbrauchten Eingang aber try
nicht ohnehin so die zu optionMaybe
weitergegeben Parsern (die innerhalb do
) ausfallen insgesamt sollte es nicht versuchen, weitere Eingaben zu konsumieren, so dass wir mit einem fehlerhaften Parser enden, ohne irgendeine Eingabe zu verbrauchen, so dass ich Right Nothing
bekommen sollte.
Aber die Fehlermeldung sagt es, der Raum ist verbraucht, also try
nicht wirklich zurückverfolgen, tut try
nicht zurückverfolgen, wenn Teil des Parsers erfolgreich ist? und wie man es mit dem oben genannten zurückbringt?
gute Antwort, aber wenn ich ersetzen 'string„Nein“' 'mit" return ‚Nein‘ '(etwas, das immer gelingt) es Rückzieher nicht einmal mit' '<|> wenn' spaceornull' gelingt – niceman
Nun, ja. ..'<|>' berücksichtigt den RHS-Parser nur dann, wenn der LHS-Vorgang fehlschlägt, ohne Eingabe zu verbrauchen. Damit? – leftaroundabout
was ist mit 'versuchen'? Ich meine '(try $ spaceornull *> String" Hallo ") <|> (zurück" Nein ")' sollte nicht mit der Eingabe "" "!!! – niceman