GHC 导入功能或错误

GHC import feature or bug

我发现 GHC 接受以下代码:

import Prelude hiding (filter)
import qualified Prelude as P

这两个导入的想法是让所有 Prelude 功能照常可用,但要求 filter 符合 P.filter

我从来没有在任何地方看到过类似的例子,因此我的问题是:这是 GHC 中的一个功能还是一个错误?

谢谢

这是一项功能,例如,如果您在 Github 中搜索,您会发现它在野外被大量使用。

一个广泛使用的成语是这样的:

import Data.Text (Text)
import qualified Data.Text as T

这样您就不必在您的类型中限定 Text 并且您不会得到与 Prelude 函数冲突的函数(例如 Data.Text.filterData.Text.zip等)。

这是允许的。导入机制非常灵活,有时令人惊讶。

例如,您可以导入不同名称的模块:

import qualified M as A
import qualified M as B

在此之后,A.xB.x都将引用M.x

也许更令人惊讶的是,您还可以导入同名的两个模块。

import qualified M as A
import qualified N as A

之后,A.x 将指代 M.xN.x。如果两者都被定义,则会触发歧义错误。

最后一个特性可能看起来很奇怪,但毕竟在没有限定的情况下导入模块时已经存在这种歧义,所以这种灵活性不需要比普通导入更多的机器。