GHC导入功能或错误

时间:2015-11-15 00:24:46

标签: haskell ghc

我发现GHC接受以下代码:

import Prelude hiding (filter)
import qualified Prelude as P

这两个导入的想法是像往常一样使所有Prelude函数可用,但要求filter被限定为P.filter

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

由于

2 个答案:

答案 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.xB.x都会引用M.x

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

import qualified M as A
import qualified N as A

在此之后,A.x会引用M.xN.x。如果两者都已定义,则会触发歧义错误。

这最后一个功能可能看起来很奇怪,但是在没有限定条件的情况下导入模块之后已经存在所有这些歧义,因此这种灵活性不需要比普通导入更多的机制。