Parsec
文件说以下关于<|>
这个组合器实现了选择。解析器 p <|> q 首先应用 p。如果成功,则返回 p 的值。如果 p 在没有消耗任何输入的情况下失败,则尝试解析器 q。这个组合器被定义为等于 MonadPlus 类的 mplus 成员和 Control.Applicative.Alternative 的 (Control.Applicative.<|>) 成员。
如何实现回溯版本<|>
?p
它在消耗任何输入时回溯,这样q
可以再次将其应用于完整输入。
Parsec
文件说以下关于<|>
这个组合器实现了选择。解析器 p <|> q 首先应用 p。如果成功,则返回 p 的值。如果 p 在没有消耗任何输入的情况下失败,则尝试解析器 q。这个组合器被定义为等于 MonadPlus 类的 mplus 成员和 Control.Applicative.Alternative 的 (Control.Applicative.<|>) 成员。
如何实现回溯版本<|>
?p
它在消耗任何输入时回溯,这样q
可以再次将其应用于完整输入。
要启用回溯,您只需使用try
,例如try p <|> q
。
但是,请注意,过度使用try
会损害解析器的性能。考虑在可能的情况下对语法进行左分解,以消除常见的前缀。