【问题标题】:Haskell *qualified* import of a set of functionsHaskell *qualified* 导入一组函数
【发布时间】:2015-01-19 03:26:15
【问题描述】:

在 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.sortList.intersperse

虽然这行不通,但这是我所要求的精神:

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

或许

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

【问题讨论】:

  • 来自haskell.org/haskellwiki/Import 看起来这是不可能的,但我不确定它有什么好处。由于您可以指定自己的前缀,因此它可以随心所欲,并且不存在与任何其他模块发生冲突的风险。 import qualified Data.List as List 有什么害处?唯一的区别是List.intercalate 将可用:只要你从不输入,你就不会知道区别,可以这么说。
  • 你也可以只创建一个辅助模块,简单地重新导出sortintersperse,然后对该模块进行合格的导入。
  • @amalloy “没有与任何其他模块发生冲突的风险”不一定正确。您可以根据需要导入任意数量的同名模块,例如,我可以想象想要从 Prelude 获得 A.map 而从 Data.Foldable 获得 A.foldr,因此会引入许多名称冲突。

标签: haskell import qualified-name


【解决方案1】:
import qualified Data.List as List (sort, intersperse)

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

5.3 进口申报

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 必须是导入声明中的最后一个元素(如果提供的话)。

【讨论】:

  • 当我使用第一种方法时,例如import qualified Data.Map as Map (findWithDefault),我仍然可以在GHCi中看到Data.Map.notMember之类的东西。除了Map.findWithDefault 之外,Map.* 什么都不可见,但它似乎也导入了所有 Data.Map。
  • @prpl.mnky.dshwshr,GHCi 通常对模块很奇怪,因为它试图对交互式开发友好。如果你想知道你真正需要什么,编译代码。
【解决方案2】:

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

import qualified A(x)

然后查找actual syntax spec,表示qualifiedas和“impspec”(导入标识符列表或隐藏标识符列表)都是可选且独立的。因此语法 genisage describes 实际上是标准的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 当我使用第一种方法时,例如import qualified Data.Map as Map (findWithDefault),我仍然可以在GHCi中看到Data.Map.notMember之类的东西。除了Map.findWithDefault 之外,Map.* 什么都不可见,但它似乎也导入了所有 Data.Map。
    • @prpl.mnky.dshwshr 我也发生了同样的事情。但我注意到,即使没有导入,我也可以使用具有完全限定名称的函数。也许另一个问题是是否有办法在 GHCi 中关闭它。
    猜你喜欢
    • 2010-11-04
    • 2016-04-30
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多