Haskell:只能通过:load一次加载一个文件

时间:2012-04-25 06:03:20

标签: haskell ghc ghci winghci

假设我有两个模块NecessaryModule1& NecessaryModule2(如帖子Haskell : loading ALL files in current directory path中所述。然后我在WinGHCi和GHCi中注意到,如果我这样做:

> :load NecessaryModule1
[1 of 1] Compiling NecessaryModule1 ( NecessaryModule1.hs, interpreted )
Ok, modules loaded: NecessaryModule1.
> addNumber1 2 3
5
> :load NecessaryModule2
[1 of 1] Compiling NecessaryModule2 ( NecessaryModule2.hs, interpreted )
Ok, modules loaded: NecessaryModule2.
> addNumber1 2 3

<interactive>:1:1: Not in scope: `addNumber1'

即。 loading NecessaryModule2消除了NecessaryModule1的所有功能。

这是否意味着我可以同时加载NecessaryModule1&amp; amp; NecessaryModule2是使用第三个文件(导入NecessaryModule1和NecessaryModule2)然后加载第三个文件? (例如,参见Haskell : loading ALL files in current directory path中的test.hs)谢谢。

----------------------------------------------- ----------------------------------------

[对geekosaur的反应]

嗨,如果我已完成:load NecessaryModule1,然后我想在MyMod.hs中加载模块:

--MyMod.hs
module MyMod where
import Data.List

f x = sort x
那我该怎么做?在Haskell : unload module in WinGHCi中,Riccardo解释说:module假设模块已经加载。这是否意味着实现加载多个自定义模块的唯一方法是通过:load函数的单次调用来加载它们?感谢。

2 个答案:

答案 0 :(得分:15)

:load加载主程序模块。 :module可用于加载其他模块:

> :load BaseModule -- this is the one that contains 'main'
> :module +AddedModule -- this is an additional library module

您还可以使用:module卸载这些附加模块:

> :module -AddedModule -- after this @AddedModule@ will no longer be loaded

如果您没有带main的模块,则可能需要使用:module +来加载所有库模块。

答案 1 :(得分:14)

好的,有两件事需要考虑:“模块”知道找到什么,以及在给定提示下实际上是什么。

:模块总是知道如何在已安装的软件包中找到模块(未隐藏),默认情况下,它只能访问所有模块。但您可以使用:load来使其了解特定文件中的某些其他模块。每次调用:加载重置附加模块的集合(和:重新加载保持相同的加载模块集但刷新其内容)。另外:load将您置于您指定的第一个模块的上下文中。

换句话说,如果您想进入导入两个模块的上下文,您需要执行以下操作:

> :load Module1 Module2
> :module Module1 Module2
  

这是否意味着实现加载多个自定义模块的唯一方法是通过单次调用:load函数加载它们?

换句话说:是的! (但这似乎不是问题,除非您需要重复过去加载的模块,如果您仍想在新的上下文中使用它们)