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.filter
、Data.Text.zip
等)。
这是允许的。导入机制非常灵活,有时令人惊讶。
例如,您可以导入不同名称的模块:
import qualified M as A
import qualified M as B
在此之后,A.x
和B.x
都将引用M.x
。
也许更令人惊讶的是,您还可以导入同名的两个模块。
import qualified M as A
import qualified N as A
之后,A.x
将指代 M.x
或 N.x
。如果两者都被定义,则会触发歧义错误。
最后一个特性可能看起来很奇怪,但毕竟在没有限定的情况下导入模块时已经存在这种歧义,所以这种灵活性不需要比普通导入更多的机器。
我发现 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.filter
、Data.Text.zip
等)。
这是允许的。导入机制非常灵活,有时令人惊讶。
例如,您可以导入不同名称的模块:
import qualified M as A
import qualified M as B
在此之后,A.x
和B.x
都将引用M.x
。
也许更令人惊讶的是,您还可以导入同名的两个模块。
import qualified M as A
import qualified N as A
之后,A.x
将指代 M.x
或 N.x
。如果两者都被定义,则会触发歧义错误。
最后一个特性可能看起来很奇怪,但毕竟在没有限定的情况下导入模块时已经存在这种歧义,所以这种灵活性不需要比普通导入更多的机器。