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 +
для загрузки всех ваших библиотечных модулей.