GHCi中的模块加载选项

时间:2014-01-08 21:32:48

标签: haskell ghci

为什么GHCi有很多不同的命令用于将模块加载到会话中?

以下是我所知道的,以及来自:help ghci的相当混乱的解释:

  • add [*]<mod> - 将模块添加到当前目标集
  • :module [+/-] [*]<mod> - 设置表达式评估的上下文
  • :load [*]<mod> - 加载模块及其家属
  • :reload <mod> - 重新加载当前模块集。 (注意::help并没有说这可以采用模块参数,但它似乎可以。)
  • import Mod

他们各自做什么?星号如何改变它?为什么这么多? :(

1 个答案:

答案 0 :(得分:12)

这里有两个不同的概念:目标集评估上下文

您使用:add:load:reload处理目标集,并使用:moduleimport处理评估上下文。

目标集是ghci正在读取和编译的本地可用模块的列表。通常,您可以使用它来指定您正在处理的源。 ghci将加载和编译这些模块及其所需的任何依赖项。

使用:load将目标集重置为给定的模块集,并使用:add将给定模块添加到现有目标集。

如果在目标集中使用*指定模块,那么它们将始终是“字节码解释” - 这意味着它们加载速度快但运行速度不如编译代码 - 否则ghci将使用编译目标文件(如果可用)和字节码解释,如果没有。

:reload自己重新加载整个目标集和依赖项。我不太确定:reload <mod>究竟做了什么,但我认为它会重新加载<mod>和依赖关系,而其他部分则保持不变。

评估上下文控制提示符下范围内的名称,并完整记录here。用于添加到评估上下文的模块可以是目标集合中的本地模块+依赖项,也可以是先前使用ghc-pkg工具(或cabal调用该工具的import Foo向ghc注册的“包”模块最终)。 :module +Foo只是撰写{{1}}的另一种方式。

注意:这个答案混合了我对使用ghci的经验的直观理解,只是阅读文档并尝试将两者整合在我的脑海中。所以我可能没有100%准确!