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

Haskell : can only load one file at a time via :load

提问人:artella 提问时间:4/25/2012 最后编辑:Communityartella 更新时间:4/25/2012 访问量:7310

问:

假设我有两个模块 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:加载当前目录路径中的所有文件)谢谢。

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

[对极客龙的回应]

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

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

f x = sort x

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

Haskell GHC GHCI 翼HCI

评论


答:

18赞 geekosaur 4/25/2012 #1

: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 +

评论

0赞 artella 4/25/2012
嗨,我有一个小问题。我把回答放在上面。谢谢
19赞 Jedai 4/25/2012 #2

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

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

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

> :load Module1 Module2
> :module Module1 Module2

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

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