看看readP Haskell解析器为什么不返回值

xzlaal3s  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(180)

我试图更好地了解readPlibrary
为什么会这样:

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

iq3niunx

iq3niunx1#

Look-ahead:返回剩余的输入部分,而不消耗它。
所以,我们在输入的剩余部分使用look,然后我们尝试eof,但是由于我们没有使用任何东西,所以我们没有在输入的末尾使用eof,所以没有成功的解析。
pLookIf中,我们有munch isDigit,它消耗了剩余的输入,所以我们在最后,eof成功。
要修复pLook,您要么需要添加一些类似于parse的东西,直到最后,要么只是在没有eof的情况下进行测试,直到您有一个可以处理整个输入的解析器。

相关问题