10

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

4

2 回答 2

10

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

  1. 它更老了。GHCi 过去真的只是一个IO do块的内部。现在它支持语言的每个部分,所以我们可以做imports. (看起来GHCi 6.6.x 不支持import,但GHCi 6.8.1支持;我们直到GHCi 7.4.1才完全支持顶级声明。)

  2. 它允许您一次导入多个模块。 :m + M1 M2 M3与写import M1, import M2, and import M3each 在一个新行上是一样的。

  3. 它使您可以取消导入模块:将在提示符处从当前范围内的内容中:m - M删除的内容。M

  4. 它允许您导入解释模块,以便您可以看到整个范围。这就是当你发生的事情:load File.hs;你发现你在模块*File中,并且可以看到所有File导入的东西,甚至是它不导出的所有东西。如果您MI加载了一个解释模块,那么您可以使用普通方式将其带入范围,并:m + M1 *MI M3M1特殊方式进入范围。M2MI

不过,为了完整起见,import语法确实为我们提供了三件:m没有的东西:

  1. 合格进口。能够做import qualified Data.Map as M和使用M.lookup比不得不做Data.Map.lookup或遭受歧义错误要好得多。(请注意,安装的每个软件包都可以在 GHCi 中完全合格,因此import qualified Module单独购买什么也不会。)

  2. 导入列表。即使我有来自Data.Mapqualified with的功能M,我仍然可以import Data.Map (Map)将类型带入非限定范围。

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

您还可以查看GHC (7.6) 用户指南中的第 2.4.5 节,“提示符的真正范围是什么?”

于 2013-10-20T21:38:40.687 回答
6

您将import在源代码中包含更通用的代码,而:m它是 ghci 特定的命令(为方便起见)。

您可以使用ghci> :m + Module1 ... ModuleN加载多个模块。使用-而不是+卸载模块。因为ghci是交互式的,我会坚持使用:m,除非您的工作流程是:编辑您的.hs文件,保存它,然后重新加载它。然后import将更合适(并且具有更多功能,例如合格的进口)。

import如果您稍后决定使用例如 编译程序,该指令也将起作用ghc。您可以选择性地仅导入特定功能:import Data.List (sort)将仅导入排序,因此对命名空间的污染更少。

于 2013-10-20T21:16:26.547 回答