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)