我发现GHC接受以下代码:
import Prelude hiding (filter)
import qualified Prelude as P
这两个导入的想法是像往常一样使所有Prelude函数可用,但要求filter
被限定为P.filter
。
我从未在任何地方看到类似的例子,因此我的问题是:这是GHC中的一个功能还是一个错误?
由于
答案 0 :(得分:3)
这是一个功能,如果你在Github中搜索,你可以看到它在野外使用了很多。
一个广泛使用的习语是:
import Data.Text (Text)
import qualified Data.Text as T
这样您就不必在类型中限定Text
,并且您不会获得与Prelude
函数冲突的函数(例如Data.Text.filter
,{ {1}}等。)。
答案 1 :(得分:3)
这是允许的。导入机制非常灵活,有时令人惊讶。
您可以使用不同的名称导入模块:
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
。如果两者都已定义,则会触发歧义错误。
这最后一个功能可能看起来很奇怪,但是在没有限定条件的情况下导入模块之后已经存在所有这些歧义,因此这种灵活性不需要比普通导入更多的机制。