Haskell *合格*导入一组函数

Haskell *qualified* import of a set of functions

在 Haskell 中,我可以导入一个由其名称或快捷方式名称限定的模块,如下所示:

import qualified Data.List as List
import qualified Data.Map

我也可以只从模块中导入 select 组函数,或者导入除 select 组之外的所有函数,如下所示:

import Data.List (sort, intersperse)
import Data.Map hiding (findWithDefault)

是否可以导入一组特定的函数,如上面的 import Data.List (sort, intersperse) 示例,但要确保函数仍然以合格的方式标识,例如 List.sortList.intersperse?

虽然这样不行,但正是我要问的精神:

import qualified Data.List (sort, intersperse) as List

或者也许

import qualified Data.List as List (sort, intersperse)

尽管 https://www.haskell.org/haskellwiki/Import 中没有提及,import qualified Foo as Bar (x, y) 似乎对我来说效果很好。我是 运行 ghc 7.6.3。也许那个特定的 wiki 页面已经过时了。如果它对您不起作用,您使用的是什么版本的 ghc?

这是允许的,至少根据 Haskell 2010 年的报告。先看examples,里面有这个:

import qualified A(x)

再往上看actual syntax spec, which indicates that the qualified, as, and "impspec" (the list of imported identifiers or the list of hidden identifiers) are all optional and independent. Thus the syntax genisage 居然是标准的

import qualified Data.List as List (sort, intersperse)

这实际上很好用。导入声明的语法如下:

5.3 Import Declarations

impdecl   →   import [qualified] modid [as modid] [impspec]

qualifiedas 不会 阻止导入规范。这不是 Haskell2010 添加的内容,因为它是 Haskell 98 report.

的一部分

另一方面你的第一个例子

import qualified Data.List (sort, intersperse) as List
--     qualified           impspec!            as modid
--                            ^                    ^         
--                            +--------------------+

不遵循语法,因为 impspec 必须是导入声明中的最后一个元素(如果提供的话)。