Haskell*限定*导入一组函数

Haskell*限定*导入一组函数,haskell,import,qualified-name,Haskell,Import,Qualified Name,在Haskell中,我可以导入由其名称或快捷方式名称限定的模块,如下所示: import qualified Data.List as List import qualified Data.Map import Data.List (sort, intersperse) import Data.Map hiding (findWithDefault) 我还可以仅从模块导入一组选择的函数,或导入除选择集以外的所有函数,如下所示: import qualified Data.List as Li

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

import qualified Data.List as List
import qualified Data.Map
import Data.List (sort, intersperse)
import Data.Map hiding (findWithDefault)
我还可以仅从模块导入一组选择的函数,或导入除选择集以外的所有函数,如下所示:

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.sort
List.intersperse

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

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

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

尽管上没有提到它,
import-qualified-Foo-as-Bar(x,y)
对我来说似乎很好。我正在运行ghc 7.6.3。也许那个特定的维基页面已经过时了。如果它不适用于您,您使用的是什么版本的ghc?

至少根据Haskell 2010报告,这是允许的。首先请参见,其中包括:

import qualified A(x)
然后查找,这表明
限定的
、以及“impspec”(导入标识符列表或隐藏标识符列表)都是可选的和独立的。因此,语法genisage实际上是标准的

import qualified Data.List as List (sort, intersperse)
这实际上很好,而且有效。进口声明的语法如下:

5.3进口报关单
限定的
作为
不会阻止导入规范。这不是Haskell 2010的新增内容,因为它一直是

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

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

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

从它看来这是不可能的,但我不确定它到底有什么好处。因为您可以指定自己的前缀,所以它可以尽可能短,并且没有与任何其他模块冲突的风险。仅导入符合条件的数据有什么害处。以列表的形式列出?唯一的区别是
List.interlate
将可用:只要你从不键入,你就不会知道区别。你也可以创建一个辅助模块,只需重新导出
sort
intersperse
,然后对该模块进行合格的导入。@amalloy“不存在与任何其他模块冲突的风险“这不一定是真的。您可以导入任意多个具有相同名称的模块,我可以想象希望从
Prelude
导入
A.map
,但是从
Data.Foldable
导入
A.foldr
,例如,这样会引入许多名称冲突。当我使用第一种方法时,例如
导入限定数据。map as map(findWithDefault)
,我仍然能够在GHCi中看到类似
Data.Map.notMember
的内容。除了
Map.findWithDefault
之外,没有任何东西是可见的。@prpl.mnky.dshwshr,GHCi对模块总体上是奇怪的,因为它试图对交互式开发友好。如果您想知道实际需要什么,请编译代码。当我使用第一种方法时,例如
导入限定数据.Map as Map(findWithDefault)
,我仍然能够在GHCi中看到类似
Data.Map.notMember
的内容。除了
Map.findWithDefault
之外,没有任何东西可以作为
Map.
看到,但它似乎也导入了所有的数据.Map.@prpl.mnky.dshwshr同样的事情发生在我身上。但我注意到,即使没有导入,我也可以使用具有完全限定名的函数。也许另一个问题是,是否有办法在GHCi中关闭该功能。