我刚刚开始学习使用 Parsec 解析字符串,我遇到了以下我无法解决的问题:
以下代码包含三个解析器运行,其中两个显然会失败。奇怪的是,我的自定义失败消息只会在第二次运行时出现,而不是在第三次运行时出现。
import Text.Parsec
import Text.Parsec.String
ps :: Parser String
ps = (string "123") <|> (string "456") <|> fail "my-failure"
main = do
putStrLn $ "A: " ++ show (parse ps "" "123")
putStrLn $ "\nB: " ++ show (parse ps "" "789")
putStrLn $ "\nC: " ++ show (parse ps "" "45x")
输出:
A: Right "123"
B: Left (line 1, column 1):
unexpected "7"
expecting "123" or "456"
my-failure
C: Left (line 1, column 1):
unexpected "x"
expecting "456"
当第二个的左侧部分失败时,让我的失败消息始终<|>
出现的正确方法是什么?我可以覆盖任何以前发生的错误吗?