我试图更好地了解readP
library:
为什么会这样:
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
1条答案
按热度按时间iq3niunx1#
Look-ahead:返回剩余的输入部分,而不消耗它。
所以,我们在输入的剩余部分使用
look
,然后我们尝试eof
,但是由于我们没有使用任何东西,所以我们没有在输入的末尾使用eof
,所以没有成功的解析。在
pLookIf
中,我们有munch isDigit
,它消耗了剩余的输入,所以我们在最后,eof
成功。要修复
pLook
,您要么需要添加一些类似于parse的东西,直到最后,要么只是在没有eof
的情况下进行测试,直到您有一个可以处理整个输入的解析器。