运算符在Haskell中的阴影

时间:2016-06-17 16:56:09

标签: haskell parsec

我想使用<|>中的Text.Parsec运算符,但我还要导入Control.Applicative,其中还包含<|>运算符。如果我不想使用丑陋的合格导入,我如何确保前一个操作符影响后者呢?

2 个答案:

答案 0 :(得分:7)

您拥有的选项,按建议的降序排列:

  • 切换到megaparsec,它围绕现有的Haskell仿函数/变换器类构建,而不是重新定义那种东西。
  • 隐藏不必要的特定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指出的编译时完成的。)