为什么GHCi有很多不同的命令用于将模块加载到会话中?
以下是我所知道的,以及来自:help
ghci的相当混乱的解释:
add [*]<mod>
- 将模块添加到当前目标集:module [+/-] [*]<mod>
- 设置表达式评估的上下文:load [*]<mod>
- 加载模块及其家属:reload <mod>
- 重新加载当前模块集。 (注意::help
并没有说这可以采用模块参数,但它似乎可以。)import Mod
他们各自做什么?星号如何改变它?为什么这么多? :(
答案 0 :(得分:12)
这里有两个不同的概念:目标集和评估上下文。
您使用:add
,:load
和:reload
处理目标集,并使用:module
和import
处理评估上下文。
目标集是ghci正在读取和编译的本地可用模块的列表。通常,您可以使用它来指定您正在处理的源。 ghci将加载和编译这些模块及其所需的任何依赖项。
使用:load
将目标集重置为给定的模块集,并使用:add
将给定模块添加到现有目标集。
如果在目标集中使用*
指定模块,那么它们将始终是“字节码解释” - 这意味着它们加载速度快但运行速度不如编译代码 - 否则ghci将使用编译目标文件(如果可用)和字节码解释,如果没有。
:reload
自己重新加载整个目标集和依赖项。我不太确定:reload <mod>
究竟做了什么,但我认为它会重新加载<mod>
和依赖关系,而其他部分则保持不变。
评估上下文控制提示符下范围内的名称,并完整记录here。用于添加到评估上下文的模块可以是目标集合中的本地模块+依赖项,也可以是先前使用ghc-pkg
工具(或cabal
调用该工具的import Foo
向ghc注册的“包”模块最终)。 :module +Foo
只是撰写{{1}}的另一种方式。
注意:这个答案混合了我对使用ghci的经验的直观理解,只是阅读文档并尝试将两者整合在我的脑海中。所以我可能没有100%准确!