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