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



假设我有两个模块EssentialModule1和EssentialModule2(如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'

即加载 EssentialModule2 会消除 EssentialModule1 中的所有功能。

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

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

[对极龙的回应]

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

--MyMod.hs
module MyMod where
import Data.List
f x = sort x

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

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

:module 始终知道如何在已安装的软件包(未隐藏)中查找模块,默认情况下,这就是它有权访问的全部内容。但是你可以使用 :load 来让它知道特定文件中的其他一些模块。每次调用 :load 重置一组附加模块(和 :reload 保留同一组加载的模块,但刷新其内容)。另外 :load 将您放入您指定的第一个模块的上下文中。

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

> :load Module1 Module2
> :module Module1 Module2

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

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

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

最新更新