我试图更好地了解readP
库:
为什么:
pLookIf :: Parser String
pLookIf = (do
looked <- look --munch isDigit
e1 <- munch isDigit
if looked == e1 then return ( "(" ++ e1 ++ ")" )
else return "88"
return looked
)
parseString input = readP_to_S (do
e <- pLookIf
eof
return e) input
返回:
ghci> parseString "8888888888888"
[("8888888888888","")]
当这
pLook :: Parser String
pLook = (do
looked <- look
return looked
)
parseString input = readP_to_S (do
e <- pLook
eof
return e) input
的回报:
ghci> parseString "8888888888888"
[]
在这两种情况下都应该返回一些值,考虑签名:look :: ReadP String
forward -ahead:返回输入中剩余的部分,而不使用它。
所以,我们在剩下的输入处取look
。然后我们尝试eof
,但是因为我们没有消耗任何东西,所以我们不在输入的末尾,eof
失败了,所以没有成功的解析。
在pLookIf
中,我们有munch isDigit
,它消耗了剩余的输入,所以我们结束了,eof
成功了。
要修复pLook
,您要么需要添加类似的东西来解析直到最后,或者只是在没有eof
的情况下进行测试,直到您有一个可以对整个输入工作的解析器。