在read中查找P Haskell解析器为什么它不返回值



我试图更好地了解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的情况下进行测试,直到您有一个可以对整个输入工作的解析器。

最新更新