我一直在阅读关于解析器组合器的教程,并且我遇到了一个函数,我希望在尝试理解时有所帮助。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