Haskell库导入语法

时间:2013-10-20 21:15:16

标签: haskell

很抱歉这个非常基本的问题:在GHCi中,import Library.Name:m +Library.Name之间有区别吗?它们似乎是等价的,但我认为这是替代语法的原因。

2 个答案:

答案 0 :(得分:9)

import Module:module + Module是完全相同的,但:module(以下简称:m)语法有几个原因。

  1. 它已经老了。 GHCi真的曾经只是IO do块的内部;现在它支持语言的每个部分,所以我们可以import。 (看起来像GHCi 6.6.x didn't support import,但是GHCi 6.8.1 did;在GHCi 7.4.1之前,我们没有完全支持顶级声明。)

  2. 它允许您一次导入多个模块。 :m + M1 M2 M3与在新行上分别撰写import M1import M2import M3相同。

  3. 它允许您取消导入模块::m - M将从提示符下的当前范围内删除M的内容。

  4. 它允许您导入已解释的模块,以便您可以看到整个范围。这是:load File.hs时发生的情况;你发现你在模块*File中,并且可以例如看到File导入的所有内容,甚至是它不导出的所有内容。如果您加载了解释模块MI,那么您可以使用:m + M1 *MI M3M1M2纳入常规范围,并将MI纳入范围特别的方式。

  5. 为了完整起见,import语法确实为我们提供了:m没有的三件事:

    1. 合格进口。能够import qualified Data.Map as M使用M.lookup而不是必须做Data.Map.lookup或遭遇歧义错误要好得多。 (请注意,安装的每个软件包都可以在GHCi中完全限定,因此import qualified Module单独购买任何软件包。)

    2. 导入列表。即使我拥有Data.Map符合M资格的函数,我仍然可以import Data.Map (Map)将该类型置于不合格的范围内。

    3. 导入hiding。与上述相反;也许我正在编写自己的排序例程,所以我可以import Data.List hiding (sort)

    4. 您还可以查看§2.4.5, "What's really in scope at the prompt?", in the GHC (7.6) user's guide

答案 1 :(得分:6)

您可以在源代码中包含import,这更通用,而:m是一个特定于ghci的命令(为方便起见)。

您可以使用ghci> :m + Module1 ... ModuleN加载多个模块。使用-代替+卸载模块。由于ghci是互动的,因此我会坚持:m,除非您的工作流程是:编辑您的.hs文件,保存并重新加载。然后import会更合适(并且有更多功能,例如qualified imports)。

如果您稍后决定使用例如import编译程序,ghc指令也会起作用。您可以有选择地仅导入特定函数:import Data.List (sort)仅导入排序,因此污染名称空间的次数较少。