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(..))
我想使用 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(..))