我一直在閱讀關於解析器組合器的教程,並且我遇到了一個函數,我希望在嘗試理解時有所幫助。Haskell解析器組合器 - 字符串函數
satisfy :: (Char -> Bool) -> Parser Char
satisfy p = item `bind` \c ->
if p c
then unit c
else (Parser (\cs -> []))
char :: Char -> Parser Char
char c = satisfy (c ==)
natural :: Parser Integer
natural = read <$> some (satisfy isDigit)
string :: String -> Parser String
string [] = return []
string (c:cs) = do { char c; string cs; return (c:cs)}
我的問題是如何做的字符串函數工作或者更確切地說,它是如何終止,說我不喜歡的東西:
let while_parser = string "while"
,然後我用它來解析字符串比方說 parse while_parser "while if"
,它會正確解析我的「while」。
但是,如果我嘗試類似parse while_parser "test
它將返回[]。
我的問題是它是如何失敗?當char c返回一個空列表時會發生什麼?
我懷疑'char c'不是「返回一個空列表」,而是在輸入結束時失敗*。綁定運算符然後傳播該失敗。 – MathematicalOrchid
你的意思是'讓while_parser = string'而'',對吧? – sepp2k
@MathematicalOrchid從char滿足的定義中,當char失敗時,它將返回一個生成空列表的函數。傳播失敗是什麼意思? – Zubair