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

art*_*lla 10 haskell ghc ghci winghci

假设我有两个模块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'
Run Code Online (Sandbox Code Playgroud)

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

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

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

[对geekosaur的反应]

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

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

f x = sort x
Run Code Online (Sandbox Code Playgroud)

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

gee*_*aur 15

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

> :load BaseModule -- this is the one that contains 'main'
> :module +AddedModule -- this is an additional library module
Run Code Online (Sandbox Code Playgroud)

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

> :module -AddedModule -- after this @AddedModule@ will no longer be loaded
Run Code Online (Sandbox Code Playgroud)

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


Jed*_*dai 15

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

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

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

> :load Module1 Module2
> :module Module1 Module2
Run Code Online (Sandbox Code Playgroud)

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

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