Home > Software design >  look in readP Haskell Parser why doesn't it return a value
look in readP Haskell Parser why doesn't it return a value

Time:12-16

I am trying to get a better intution of the readP library :

Why does this:

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

return:

ghci> parseString "8888888888888"
[("8888888888888","")]

When this

pLook :: Parser String 
pLook = (do
        looked <- look
        return looked
        )

parseString input = readP_to_S (do                         
                        e <- pLook
                        eof
                        return e) input

Returns:

ghci> parseString "8888888888888"
[]

In both cases some value should be returned, considering the signature: look :: ReadP String

CodePudding user response:

Look-ahead: returns the part of the input that is left, without consuming it.

So, we look at the rest of the input. Then we try eof, but since we haven't consumed anything we are not at the end of the input and eof fails, so there are no successful parses.

In pLookIf we have munch isDigit which consumes the rest of the input, so we are at the end and eof succeeds.

To fix pLook you either need to add something similar to parse up to the end, or just test without the eof until you have a parser that works on the whole input.

  • Related