我想使用<|>
中的Text.Parsec
运算符,但我还要导入Control.Applicative
,其中还包含<|>
运算符。如果我不想使用丑陋的合格导入,我如何确保前一个操作符影响后者呢?
答案 0 :(得分:7)
您拥有的选项,按建议的降序排列:
隐藏不必要的特定Parsec.<|>
。你不需要它。
import Text.Parsec hiding ((<|>))
import Control.Applicative
隐藏Applicative.<|>
并仅使用Control.Applicative
中与替代品无关的内容。
import Text.Parsec
import Control.Applicative hiding (Alternative(..))
答案 1 :(得分:2)
执行此操作的正确方法是合格导入或隐藏
导入import qualified Control.Applicative as CA
import Text.Parsec
或者如果您不想使用合格的
import Control.Applicative hiding ((<|>))
import Text.Parsec
阴影不起作用,因为两个导入都存在于同一个命名空间中,因此ghc无法推断出正确的函数选择,即你想要的那个。
据我所知,阴影仅适用于生成新范围的功能块。
此外,导入的顺序使得懒惰的评估语言有其危险,即使我不是专家我会猜测,如果导入库取决于是否使用它或使用哪个会影响导入的顺序。
如果在导入点上有一个名字阴影 - 那么导入的顺序就会有所不同,这是你在懒惰评估的语言中不常用的东西,通常执行纯粹的顺序函数是任意的(即使导入是在@TikhonJelvis指出的编译时完成的。)