首页 文章

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

提问于
浏览
10

假设我有两个模块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'

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

那么这是否意味着我可以同时加载NecessaryModule1和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 回答

  • 14

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

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

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

    > :load Module1 Module2
    > :module Module1 Module2
    

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

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

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

相关问题