
Daniel Fischer wrote:
Bad bug in Parsec (from the beginning, the same happens in parsec-2), I'd say. I'd say, its a feature. lookAhead returns whatever its argument returns. So in this case it returns "Consumed" without consuming.
In that case, the comment
"lookAhead p parses p without consuming any input."
from the parsec-3 docs is highly misleading.
Yes, it isn't even documented in http://legacy.cs.uu.nl/daan/parsec.html I'ld say not consuming something after a successful lookAhead is an error (and if the argument of lookAhead consumes nothing, that is also odd.) In most cases "try" is the better alternative, where the result of try should be used as input for the following parser: (try identifierStart >>= indentifierRest) <|> constant
But lookAhead returning Consumed is not only counterintuitive, try
parseTest (many la) "a"
for a nice memory bomb.
It's as dangerous as using "setInput" and making the input longer (for recursive calls). But I don't see any disadvantages if "lookAhead" would return "Empty (Ok ...)", so I'ld also propose to change it (as you did). Cheers Christian