私はParsecで文字列を解析することを学び始めたばかりで、次の問題に直面しています。
次のコードには 3 つのパーサーの実行が含まれており、そのうちの 2 つは明らかに失敗します。奇妙なことに、カスタムの失敗メッセージは、3 回目ではなく 2 回目の実行でのみ発生します。
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"
2番目の左側の部分が失敗したときに常に失敗メッセージを表示させる正しい方法は何<|>
ですか? 以前に発生したエラーを上書きできますか?