Haskell 中的运算符阴影

Operator shadowing in Haskell

我想使用 Text.Parsec 中的 <|> 运算符,但我还导入了 Control.Applicative,其中还包含一个 <|> 运算符。假设我不想使用丑陋的合格导入,我如何确保前者隐藏后者?

执行此操作的正确方法是合格的导入或隐藏的导入

import qualified Control.Applicative as CA
import Text.Parsec

或者如果您不想使用合格的

import Control.Applicative hiding ((<|>))
import Text.Parsec

阴影将不起作用,因为两个导入都位于同一个名称空间中,因此 ghc 无法推断出正确的函数选择,即您的意思。

据我所知,阴影仅适用于生成新作用域的功能块。

此外,在一种惰性评估的语言中,导入的顺序有其危险,即使我不是专家,我猜如果一个库被导入取决于它是否被使用或它在哪里使用会影响导入顺序。

更新:

如果在导入时有一个名称阴影 - 那么导入的顺序会有所不同,这是您在惰性评估语言中不习惯的事情,通常顺序纯函数的执行是任意的(即使正如@TikhonJelvis 指出的那样,导入是在编译时完成的)。

您的选择,按推荐的降序排列:

  • 切换到 megaparsec,它是围绕现有 Haskell 仿函数/转换器 类 构建的,而不是重新定义那种东西。
  • 隐藏不必要的特定 Parsec.<|>。你不需要它。

    import Text.Parsec hiding ((<|>))
    import Control.Applicative
    
  • 隐藏 Applicative.<|> 并仅使用 Control.Applicative 中与替代方案无关的内容。

    import Text.Parsec
    import Control.Applicative hiding (Alternative(..))