在 Haskell 中链接两个解析器(秒差距)

Chain two parsers in Haskell (Parsec)

Parsec 提供了一个运算符来在两个解析器之间进行选择:

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

是否有类似的函数来链接两个解析器?我没有找到使用 Hoogle.

具有相同签名的

举个例子,假设我想解析任何可选地后跟一个数字的单词。我的第一个想法是使用 >> 但它似乎不起作用。

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

我使用 fmap pure 将数字转换为实际字符串,从而匹配 many1 letter 的解析类型。不知道有没有用

试试这个:

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

这相当于:

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

option [] (fmap pure digit) return 如果解析器 digit 失败则为空字符串,否则为来自一个数字字符的字符串。

您还可以使用 do-notation 以获得更具可读性的代码:

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