
Daniel Fischer wrote:
Am Donnerstag 20 August 2009 13:44:15 schrieb Martijn van Steenbergen:
Goedemiddag café,
la :: Parsec String () (Maybe Char) la = lookAhead (optionMaybe anyChar) *Lookahead> parseTest (char 'a' <|> char 'b') "a" 'a' *Lookahead> parseTest (char 'a' <|> char 'b') "b" 'b' *Lookahead> parseTest (la *> char 'a' <|> char 'b') "a" 'a' *Lookahead> parseTest (la *> char 'a' <|> char 'b') "b"
Consider the following function, using parsec-3.0.0: parse error at (line 1, column 2): unexpected "b" expecting "a"
The first three work fine and as expected, but the fourth example fails where I would expect success. I know <|> won't try the rhs if the lhs consumed input, but lookAhead's documentation promises not to consume any input. Is this a bug in Parsec or am I missing something?
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. You can always wrap around a "try" to force the alternative: parseTest (try (la >> char 'a') <|> char 'b') "b" Cheers Christian Maybe it should have been: la >> (char 'a' <|> char 'b') in the first place.