很抱歉这个非常基本的问题:在GHCi中,import Library.Name
和:m +Library.Name
之间有区别吗?它们似乎是等价的,但我认为这是替代语法的原因。
答案 0 :(得分:9)
import Module
和:module + Module
是完全相同的,但:module
(以下简称:m
)语法有几个原因。
它已经老了。 GHCi真的曾经只是IO
do
块的内部;现在它支持语言的每个部分,所以我们可以import
。 (看起来像GHCi 6.6.x didn't support import
,但是GHCi 6.8.1 did;在GHCi 7.4.1之前,我们没有完全支持顶级声明。)
它允许您一次导入多个模块。 :m + M1 M2 M3
与在新行上分别撰写import M1
,import M2
和import M3
相同。
它允许您取消导入模块::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
符合M
资格的函数,我仍然可以import Data.Map (Map)
将该类型置于不合格的范围内。
导入hiding
。与上述相反;也许我正在编写自己的排序例程,所以我可以import Data.List hiding (sort)
。
您还可以查看§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)
仅导入排序,因此污染名称空间的次数较少。