Haskell: может загружать только один файл за раз: load

Предположим, у меня есть два модуля 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), а затем загрузить этот третий файл? (например, см. test.hs в Haskell: загрузка ВСЕХ файлов в текущий путь к каталогу) Спасибо.

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

[ОТВЕТ НА ГИОКОЗАУРА]

Привет, поэтому, если я сделал :load NecessaryModule1, а затем хочу загрузить модуль в MyMod.hs:

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

f x = sort x

то как мне это сделать? В Haskell: выгрузите модуль в WinGHCi Риккардо объясняет, что :module предполагает, что модули уже загружены. Значит ли это, что единственный способ достичь загрузки нескольких настраиваемых модулей - загрузить их одним вызовом функции :load? Спасибо.

Ответ 1

Хорошо, есть две вещи, которые нужно учитывать: что "модуль" знает, чтобы найти, и что на самом деле находится в контексте в заданной подсказке.

: модуль всегда знает, как найти модули в установленных пакетах (которые не скрыты), и по умолчанию все, к чему у него есть доступ. Но вы можете использовать: load, чтобы узнать о некоторых других модулях в определенных файлах. Каждый вызов: load reset набор дополнительных модулей (и: перезагрузка сохраняют один и тот же набор загруженного модуля, но обновляют их содержимое). Также: load помещает вас в контекст первого указанного вами модуля.

Другими словами, если вы хотите попасть в контекст, где оба модуля импортированы, вам нужно сделать:

> :load Module1 Module2
> :module Module1 Module2

Значит ли это, что единственный способ достичь загрузки нескольких настраиваемых модулей - загрузить их одним вызовом функции загрузки:

Другими словами: да! (но это не похоже на проблему, за исключением того, что вам нужно повторять модули, которые вы загружали в прошлом, если вы все еще хотите использовать их в новом контексте)

Ответ 2

:load загружает ваш основной программный модуль. :module можно использовать для загрузки дополнительных модулей:

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

Вы также можете использовать :module для выгрузки этих дополнительных модулей:

> :module -AddedModule -- after this @[email protected] will no longer be loaded

Если у вас нет модуля с main, вы можете использовать :module + для загрузки всех ваших библиотечных модулей.