Concatena due parser in Haskell (Parsec)

Sep 08 2020

Parsec fornisce un operatore per scegliere tra due parser:

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

Esiste una funzione simile per concatenare due parser? Non ne ho trovato uno con la stessa firma utilizzando Hoogle.


Ad esempio, diciamo che voglio analizzare qualsiasi parola facoltativamente seguita da una singola cifra. La mia prima idea era di usare >>ma non sembra funzionare.

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

Ho usato fmap pureper convertire la cifra in una stringa effettiva e quindi abbinare il tipo analizzato di many1 letter. Non so se sia utile.

Risposte

4 SergeyKuz1001 Sep 07 2020 at 22:32

Prova questo:

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

Questo è equivalente a:

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

option [] (fmap pure digit)restituisce una stringa vuota se il parser ha digitavuto esito negativo e una stringa da un carattere digitale in caso contrario.

Puoi anche usare la notazione per un codice più leggibile:

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