[Haskell-cafe] Re: Parsec lookahead and <|>

Christian Maeder Christian.Maeder at dfki.de
Thu Aug 20 14:21:30 EDT 2009

Daniel Fischer wrote:
> Am Donnerstag 20 August 2009 13:44:15 schrieb Martijn van Steenbergen:
>> Goedemiddag café,
>> Consider the following function, using parsec-3.0.0:
>>> 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"
>> 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.

More information about the Haskell-Cafe mailing list