Rantai dua parser di Haskell (Parsec)

Sep 08 2020

Parsec menyediakan operator untuk memilih di antara dua 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

Apakah ada fungsi yang mirip dengan rantai dua parser? Saya tidak menemukan satu pun dengan tanda tangan yang sama di Hoogle.


Sebagai contoh, katakanlah saya ingin mengurai kata apa pun secara opsional diikuti dengan satu digit. Ide pertama saya adalah menggunakan >>tetapi sepertinya tidak berhasil.

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

Saya digunakan fmap pureuntuk mengubah digit menjadi string aktual dan dengan demikian cocok dengan jenis parsing many1 letter. Saya tidak tahu apakah itu berguna.

Jawaban

4 SergeyKuz1001 Sep 07 2020 at 22:32

Coba ini:

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

Ini sama dengan:

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

option [] (fmap pure digit)mengembalikan string kosong jika parser digitgagal dan string dari satu karakter digital sebaliknya.

Anda juga dapat menggunakan notasi untuk kode yang lebih mudah dibaca:

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