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

a 夏天 提交于 2021-02-04 13:19:04

问题


suppose I have two modules NecessaryModule1 & NecessaryModule2 (as outlined in the post Haskell : loading ALL files in current directory path. Then I have noticed in both WinGHCi and GHCi that if I do :

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

i.e. loading NecessaryModule2 eliminates all the functions from NecessaryModule1.

So does that mean that the only way I can simultaneously load NecessaryModule1 & NecessaryModule2 is to use a third file (which imports both NecessaryModule1 & NecessaryModule2) and then load that third file? (e.g. see test.hs in Haskell : loading ALL files in current directory path) Thanks.

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

[RESPONSE TO geekosaur]

Hi, so if I have done :load NecessaryModule1 and then I want to load the module in MyMod.hs :

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

f x = sort x

then how would I do this? In Haskell : unload module in WinGHCi Riccardo explains that :module assumes that the modules have already been loaded. So does this mean that the only way to achieve the loading of multiple custom modules is to load them with a single call of the :load function? Thanks.


回答1:


Ok, there are two things to consider : what ":module" know to find, and what is actually in context at a given prompt.

:module always know how to find modules in installed packages (that are not hidden) and by default that's all that it has access to. But you can use :load to make it aware of some other modules in specific files. Each call of :load reset the set of additional modules (and :reload keep the same set of loaded module but refresh their content). Also :load put you into the context of the first module you specify.

In other word, if you want to get into a context where both modules are imported, you need to do :

> :load Module1 Module2
> :module Module1 Module2

So does this mean that the only way to achieve the loading of multiple custom modules is to load them with a single call of the :load function?

In other words : yes ! (but that doesn't seem to be a problem except that you need to repeat modules you loaded in the past if you still want to use them in the new context)




回答2:


:load loads your main program module. :module can be used to load additional modules:

> :load BaseModule -- this is the one that contains 'main'
> :module +AddedModule -- this is an additional library module

You can also use :module to unload these additional modules:

> :module -AddedModule -- after this @AddedModule@ will no longer be loaded

If you don't have a module with a main, you may want to use :module + to load all of your library modules.



来源:https://stackoverflow.com/questions/10310166/haskell-can-only-load-one-file-at-a-time-via-load

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!