Ответ 1
Здесь есть две различные концепции: целевой набор и контекст оценки.
Вы работаете с целевым набором с помощью :add
:load
и :reload
, и вы работаете с контекстом оценки с помощью :module
и import
.
Целевой набор - это список локально доступных модулей, которые ghci читает и компилирует. Обычно вы должны использовать это, чтобы указать источник, над которым вы работаете. ghci будет загружать и компилировать каждый из этих модулей и любые необходимые ему зависимости.
Вы используете :load
для сброса заданного набора точно к данному набору модулей и :add
чтобы добавить данные модули к существующему целевому набору.
Если вы укажете модули в целевом наборе с *
то они всегда будут "интерпретироваться байт-кодом" - это означает, что они быстро загружаются, но не работают так быстро, как скомпилированный код, иначе ghci будет использовать скомпилированный объектный файл, если он доступен, и интерпретация байт-кода если не.
:reload
самостоятельно перезагружает весь целевой набор и зависимости. Я не совсем уверен, что именно :reload <mod>
, но я думаю, что он перезагружает <mod>
и зависимости и оставляет остальное нетронутым.
Контекст оценки контролирует, какие имена находятся в области видимости в подсказке, и полностью документирован здесь. Модули для добавления в контекст оценки могут быть либо локальными в целевом наборе + зависимостей, либо быть "пакетными", которые ранее были зарегистрированы с помощью ghc, используя инструмент ghc-pkg
(или cabal
который вызывает это в конечном итоге). import Foo
- это еще один способ написания :module +Foo
.
ПРИМЕЧАНИЕ: этот ответ представляет собой смесь моего интуитивного понимания из моего опыта использования ghci и просто чтения документации и попыток интеграции этих двух в моем сознании. Так что я, возможно, не получил это на 100% точным!