0
我剛開始學習用秒差距解析字符串,我面臨着以下的問題,我不能去繞到我的腦海:秒差距解析器:自定義失敗在一定條件下不計算
以下代碼包含三個解析器運行,其中兩個顯然會失敗。奇怪的是,我的自定義失敗消息只會在第二次運行時發生,而不會發生在第三次。
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"
是什麼讓我的失敗消息出現總是當第二<|>
的部分左側失敗的正確方法是什麼?我可以覆蓋以前發生的任何錯誤嗎?
取代'<|>不合格 「我的失敗」'你可能更願意使用[''>(http://hackage.haskell.org/packages/archive/parsec/latest/doc/html/Text -Parsec-Prim.html#v:-60--63--62-),如'>「語法元素」',它將產生錯誤信息'expectcting syntax element'而不是'my-failure'。但是你仍然需要使用'try'。 – Beetle 2013-03-13 18:20:13