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)
如果解析器 digit
失败则返回空字符串,否则返回一个数字字符的字符串。
您还可以使用 do-notation 来获得更具可读性的代码:
parser = do
s1 <- many1 letter
s2 <- option "" (fmap pure digit)
return (s1 ++ s2)
关于parsing - 在 Haskell 中链接两个解析器 (Parsec),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63780263/