繁体   English   中英

在 Haskell (Parsec) 中链接两个解析器

[英]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)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM