(+++)运算符在Text.ParserCombinators.ReadP(Haskell)中的作用是什么

时间:2017-09-21 13:17:40

标签: parsing haskell

我在ReadP包中遇到对称选择(+++)运算符时遇到了问题。

https://www.haskell.org/cabal/release/cabal-1.22.8.0/doc/API/Cabal/Distribution-Compat-ReadP.html

由于我在互联网上找不到很多ReadP lib的例子,我只是尝试了一些东西。

我注意到有偏见的选择按预期工作。倾向于解析左边,如果失败则选择正确的解析器。

fmap Just (munch1 dianaFloat) <++ return Nothing

如果我插入对称选择运算符。算法没有完成。

fmap Just (munch1 dianaFloat) +++ return Nothing

如果我让左手失败,他们都会产生相同的结果:

fpail) <++ return Nothing

==

fpail) +++ return Nothing

所以我的问题是,(+++)运算符有什么用处,因为当它们都成功解析时似乎没有完成。

1 个答案:

答案 0 :(得分:5)

+++运算符可以回溯以同时为您提供两种结果 可能性可行。这是一个简单的例子:

> readP_to_S (many (string "aa" +++ string "a") <* eof) "aaa"
[(["aa","a"],""),(["a","aa"],""),(["a","a","a"],"")]

如果您在此处使用<++,则只能获得第一个结果。

你的例子在某些情况下也可以正常工作,允许两个 可能性(剩余不同的输入量):

> readP_to_S (fmap Just (munch1 (=='a')) +++ return Nothing) "aaa"
[(Nothing,"aaa"),(Just "aaa","")]

我的猜测是你在可能的情况下使用它 让它继续反复选择return Nothing,就像在里面一样 many或递归。因为这不消耗任何字符 可能试图产生一个涉及选择“返回”的解析 没有什么“反复永远,永远不会进一步通过 输入

或者它可能会生成无限数量的解析 示例一,它使用return Nothing一次,另一个使用它 它两次,依此类推。虽然在这种情况下通常会很开心 开始打印无限的解析列表,所以你可能知道 关于它。