Kette zwei Parser in Haskell (Parsec)

Sep 08 2020

Parsec bietet einen Operator zur Auswahl zwischen zwei Parsern:

(<|>)
  :: Text.Parsec.Prim.ParsecT s u m a
     -> Text.Parsec.Prim.ParsecT s u m a
     -> Text.Parsec.Prim.ParsecT s u m a

Gibt es eine ähnliche Funktion, um zwei Parser zu verketten? Ich habe mit Hoogle keine mit derselben Signatur gefunden.


Angenommen, ich möchte ein beliebiges Wort analysieren, gefolgt von einer einzelnen Ziffer. Meine erste Idee war zu verwenden, >>aber es scheint nicht zu funktionieren.

parser = many1 letter >> optional (fmap pure digit)

Ich habe verwendet fmap pure, um die Ziffer in eine tatsächliche Zeichenfolge umzuwandeln und damit dem analysierten Typ von zu entsprechen many1 letter. Ich weiß nicht, ob es nützlich ist.

Antworten

4 SergeyKuz1001 Sep 07 2020 at 22:32

Versuche dies:

parser = (++) <$> many1 letter <*> option "" (fmap pure digit)

Dies entspricht:

parser = pure (++) <*> many1 letter <*> option "" (fmap pure digit)

option [] (fmap pure digit)Geben Sie eine leere Zeichenfolge zurück, wenn der Parser digitfehlgeschlagen ist, andernfalls eine Zeichenfolge aus einem digitalen Zeichen.

Sie können auch die Do-Notation für besser lesbaren Code verwenden:

parser = do
    s1 <- many1 letter
    s2 <- option "" (fmap pure digit)
    return (s1 ++ s2)