使用Control.Applicative
对Parsec非常有用,但是你需要始终隐藏<|>
和类似的对象,因为它们与Parsec自己的对象冲突:
import Control.Applicative hiding ((<|>), many, optional)
import Text.Parsec.Combinator
import Text.Parsec
或者,正如Antal S-Z指出的那样,你可以隐藏Parsec版本。但是,据我所知,这似乎是一个不必要的限制。
为什么parsec不是简单地从Applicative实现这些运算符?
答案 0 :(得分:19)
这是出于历史原因。 Parsec库早于应用仿函数的发现,因此它并未考虑到它们的设计。我想没有人花时间更新Parsec以使用Control.Applicative
。不这样做没有深层次的根本原因。