12

假设我有两个模块 NecessaryModule1 和 NecessaryModule2 (如Haskell 后所述:在当前目录路径中加载所有文件。然后我在 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'

即加载NecessaryModule2 消除了NecessaryModule1 中的所有功能。

那么这是否意味着我可以同时加载 NecessaryModule1 和 NecessaryModule2 的唯一方法是使用第三个文件(同时导入 NecessaryModule1 和 NecessaryModule2)然后加载第三个文件?(例如,参见Haskell 中的 test.hs:在当前目录路径中加载所有文件)谢谢。

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

[对极客龙的回应]

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

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

f x = sort x

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

4

2 回答 2

19

好的,有两件事需要考虑:":module" 知道要找到什么,以及在给定提示符下实际在上下文中的内容。

:module 总是知道如何在已安装的包(未隐藏)中查找模块,默认情况下这就是它可以访问的全部。但是你可以使用 :load 让它知道特定文件中的一些其他模块。每次调用 :load 都会重置附加模块集(并且 :reload 保持相同的加载模块集但刷新它们的内容)。此外 :load 会将您置于您指定的第一个模块的上下文中。

换句话说,如果你想进入两个模块都被导入的上下文,你需要做:

> :load Module1 Module2
> :module Module1 Module2

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

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

于 2012-04-25T10:16:20.643 回答
17

: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 +来加载所有库模块。

于 2012-04-25T06:22:49.017 回答