parsing - 在 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)
如果解析器失败,则返回空字符串,否则返回digit
一个数字字符的字符串。
您还可以使用 do-notation 来获得更易读的代码:
parser = do
s1 <- many1 letter
s2 <- option "" (fmap pure digit)
return (s1 ++ s2)
推荐阅读
- c - 当位图在 Allegro 中跟随另一个位图时闪烁
- python - 是否可以让 Kivy 应用程序窗口自动适应内部单个标签的大小?
- python - Python:使用 Facebook Graph API 在针对特定语言环境的 Facebook 页面上发布帖子
- google-assistant-sdk - 如何使用 Google Assistant SDK 完全禁用 HTML 响应?
- bash - 如何在 UNIX 中递归获取完整路径?
- c++ - 输出没有重复元素的动态数组(缩小数组)C++
- javascript - 为什么我的 Switch 语句中的 Return 语句没有按预期工作?
- string - 如何使用 PowerShell 从字符串中读取变量?
- c# - 使用 AzureDevOps Rest Client 库从发布定义中删除环境
- delphi - libpq.dylib x86 客户端库