Параметры загрузки модуля в GHCi

Почему у GHCi есть так много разных команд для загрузки модулей в сеанс?

Вот те, о которых я знаю, вместе со своими довольно запутанными объяснениями :help в ghci:

  • add [*]<mod> - добавить модуль (модули) к текущему целевому набору
  • :module [+ / -] [*]<mod> - установить контекст для оценки выражения
  • :load [*]<mod> - загрузочный модуль (модули) и их иждивенцы
  • :reload <mod> - перезагрузить текущий набор модулей. (Примечание:: :help не говорит, что это может принимать аргумент модуля, но кажется, что он может.)
  • import Mod

Что они делают каждый? Как звездочка меняет его? Почему их так много? :(

Ответ 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% точным!