14

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

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

我也可以只从模块中导入一组精选的函数,或者导入除了精选集以外的所有函数,如下所示:

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

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

虽然这不起作用,但这是我所要求的精神:

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

也许

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

3 回答 3

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

这实际上很好并且有效。导入声明的语法如下:

5.3 进口申报

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

qualified并且as不要阻止导入规范。这不是 Haskell2010 的补充,因为它是Haskell 98 报告的一部分。

另一方面,你的第一个例子

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

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

于 2015-01-19T08:13:36.693 回答
5

这是允许的,至少根据 Haskell 2010 报告。首先查看示例,其中包括以下示例:

import qualified A(x)

然后查看实际的语法规范,它表明qualifiedas和“impspec”(导入标识符列表或隐藏标识符列表)都是可选且独立的。因此,genisage描述的语法实际上是标准的。

于 2015-01-19T06:30:41.960 回答
5

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

于 2015-01-19T05:18:06.397 回答