import Library.Name
很抱歉这个非常基本的问题:在 GHCi 中,和之间有区别:m +Library.Name
吗?它们看起来是等价的,但我认为替代语法是有原因的。
2 回答
你是对的import Module
并且是相同的,但是(以下简称)语法:module + Module
有几个原因。:module
:m
它更老了。GHCi 过去真的只是一个
IO
do
块的内部。现在它支持语言的每个部分,所以我们可以做import
s. (看起来GHCi 6.6.x 不支持import
,但GHCi 6.8.1支持;我们直到GHCi 7.4.1才完全支持顶级声明。)它允许您一次导入多个模块。
:m + M1 M2 M3
与写import M1
,import M2
, andimport M3
each 在一个新行上是一样的。它使您可以取消导入模块:将在提示符处从当前范围内的内容中
:m - M
删除的内容。M
它允许您导入解释模块,以便您可以看到整个范围。这就是当你发生的事情
:load File.hs
;你发现你在模块*File
中,并且可以看到所有File
导入的东西,甚至是它不导出的所有东西。如果您MI
加载了一个解释模块,那么您可以使用普通方式将其带入范围,并:m + M1 *MI M3
以M1
特殊方式进入范围。M2
MI
不过,为了完整起见,import
语法确实为我们提供了三件:m
没有的东西:
合格进口。能够做
import qualified Data.Map as M
和使用M.lookup
比不得不做Data.Map.lookup
或遭受歧义错误要好得多。(请注意,安装的每个软件包都可以在 GHCi 中完全合格,因此import qualified Module
单独购买什么也不会。)导入列表。即使我有来自
Data.Map
qualified with的功能M
,我仍然可以import Data.Map (Map)
将类型带入非限定范围。导入
hiding
. 与上述相反;也许我正在编写自己的排序程序,所以我可以做到import Data.List hiding (sort)
。
您将import
在源代码中包含更通用的代码,而:m
它是 ghci 特定的命令(为方便起见)。
您可以使用ghci> :m + Module1 ... ModuleN
加载多个模块。使用-
而不是+
卸载模块。因为ghci
是交互式的,我会坚持使用:m
,除非您的工作流程是:编辑您的.hs
文件,保存它,然后重新加载它。然后import
将更合适(并且具有更多功能,例如合格的进口)。
import
如果您稍后决定使用例如 编译程序,该指令也将起作用ghc
。您可以选择性地仅导入特定功能:import Data.List (sort)
将仅导入排序,因此对命名空间的污染更少。