我在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
所以我的问题是,(+++)运算符有什么用处,因为当它们都成功解析时似乎没有完成。
答案 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
一次,另一个使用它
它两次,依此类推。虽然在这种情况下通常会很开心
开始打印无限的解析列表,所以你可能知道
关于它。