18
votes

Using Control.Applicative is very useful with Parsec, but you need to always hide <|> and similar objects as they conflict with Parsec's own:

import Control.Applicative hiding ((<|>), many, optional)
import Text.Parsec.Combinator
import Text.Parsec

Alternatively, as Antal S-Z points out, you can hide the Parsec version. However, as far as I can tell, this seems like an unnecessary restriction.

Why did parsec not simply implement these operators from Applicative?

1
Note that you can hide the operators from Parsec instead, and thus use only the nice general ones in your code.Antal Spector-Zabusky
Tx. I added this note to the main textluispedro

1 Answers

20
votes

It's for historic reasons. The Parsec library predates the discovery of applicative functors and so it wasn't designed with them in mind. And I guess no one has taken the time to update Parsec to use Control.Applicative. There is no deep fundamental reason for not doing it.