在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)

如果解析器digit失败,则option [] (fmap pure digit)返回空字符串,否则返回一个数字字符中的字符串。

您还可以使用do表示法来获得可读性更强的代码:

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

最新更新