我在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
所以我的问题是,(+++)运算符有什么用处,因为它们在解析成功时似乎都没有完成.
+++当两种可能性都有效时,操作员可以回溯给你两个结果.这是一个简单的例子:
> readP_to_S (many (string "aa" +++ string "a") <* eof) "aaa"
[(["aa","a"],""),(["a","aa"],""),(["a","a","a"],"")]
Run Code Online (Sandbox Code Playgroud)
如果您<++在这里使用,您将只获得第一个结果.
您的示例在某些情况下也可以正常工作,允许两种可能性(剩余不同的输入量):
> readP_to_S (fmap Just (munch1 (=='a')) +++ return Nothing) "aaa"
[(Nothing,"aaa"),(Just "aaa","")]
Run Code Online (Sandbox Code Playgroud)
我的猜测是你在某些情况下使用它,它可以继续return Nothing反复选择,比如在一个
many或一个递归中.由于这不会消耗任何字符,因此可能会尝试生成一个解析,其中包括永远反复选择"return Nothing"并且从不进一步完成输入.
或者它可以产生无限数量的解析,例如一次使用return Nothing一次,另一次使用两次,依此类推.虽然在这种情况下,通常很乐意开始打印无限的解析列表,所以你可能知道它.