GHCi [1] — интерактивная среда GHC, включающая интерактивный отладчик (см. Отладчик GHCi).
GHCi может
- интерактивно вычислять выражения Haskell
- интерпретировать программы Haskell
- загружать скомпилированные модули GHC.
В настоящее время GHCi поддерживает большинство расширений языка GHC.
3.1. Введение в GHCi
Начнём с примера сеанса GHCi. Вы можете запустить GHCi с помощью команды ghci.
$ ghci GHCi, version 8.y.z: https://www.haskell.org/ghc/ :? for help ghci>
Возможно, произойдёт небольшая пауза во время загрузки GHCi прелюдии и стандартных библиотек, после чего появится приглашение. Как указано в заголовке, вы можете ввести :?, чтобы увидеть список доступных команд и краткое описание каждой из них. Мы объясним большинство этих команд по ходу дела, а полная документация по всем командам находится в разделе Команды GHCi.
Выражения Haskell можно вводить в приглашении:
ghci> 1+2 3 ghci> let x = 42 in x / 9 4.666666666666667 ghci>
GHCi интерпретирует всю строку как выражение для вычисления. Выражение не может занимать несколько строк — как только вы нажмёте Enter, GHCi попытается вычислить его.
В Haskell выражение let следует за in. Однако в GHCi, так как выражение также может быть интерпретировано в монаде IO, привязку let без сопровождающего in можно обозначить пустой строкой, как в приведённом выше примере.
Начиная с GHC 8.0.1, вы можете привязывать значения и функции к именам без let:
ghci> x = 42 ghci> x 42 ghci>
3.2. Загрузка исходных файлов
Предположим, у нас есть следующий исходный код Haskell, который мы поместим в файл Main.hs:
main = print (fac 20) fac 0 = 1 fac n = n * fac (n-1)
Вы можете сохранить Main.hs в любом месте, но если вы сохраните его не в текущем каталоге [3], то нам нужно будет перейти в нужный каталог в GHCi:
ghci> :cd dir
где ⟨dir⟩ — каталог (или папка), в котором вы сохранили Main.hs.
Для загрузки файла Haskell в GHCi используйте команду :load:
ghci> :load Main Compiling Main ( Main.hs, interpreted ) Ok, modules loaded: Main. *ghci>
GHCi загрузил модуль Main, и приглашение изменилось на *ghci>, чтобы указать, что текущий контекст для выражений, вводимых в приглашении, — это модуль Main, который мы только что загрузили (мы объясним, что означает *, позже в разделе Что действительно находится в области видимости в приглашении?). Теперь мы можем вводить выражения, использующие функции из модуля Main.hs:
*ghci> fac 17 355687428096000
Загрузка многомодульной программы также проста; просто укажите имя «главного» модуля команде :load (подсказка: :load можно сократить до :l). Главный модуль обычно будет Main, но не обязательно. GHCi обнаружит, какие модули требуются, непосредственно или косвенно, основным модулем, и загрузит их все в порядке зависимости.
Если вы запустили GHCi из командной строки, то текущий каталог GHCi совпадает с текущим каталогом оболочки, из которой он был запущен. Если вы запустили GHCi из меню «Пуск» в Windows, то текущий каталог, вероятно, будет чем-то вроде C:\Documents and Settings\user name.
-
-fshow-loaded-modules -
- Значение по умолчанию:
-
выключено
- С версии:
-
8.2.2
Обычно GHCi отображает только количество загруженных модулей после команды
:load. С этим флагом GHC также будет перечислять имена загруженных модулей. Это было поведением по умолчанию до GHC 8.2.1 и может быть полезно для некоторых пользователей инструментов.
3.2.1. Модули и имена файлов
Вопрос: Как GHC находит имя файла, содержащий модуль ⟨M⟩? Ответ: он ищет файл M.hs, или M.lhs. Это означает, что для большинства модулей имя модуля должно совпадать с именем файла. Если это не так, GHCi не сможет его найти.
Есть одно исключение из этого общего правила: когда вы загружаете программу с помощью :load, или указываете её при вызове ghci, вы можете указать имя файла вместо имени модуля. Этот файл загружается, если он существует, и он может содержать любой модуль. Это особенно удобно, если у вас несколько Main модулей в одном каталоге, и вы не можете назвать их все Main.hs.
Путь поиска исходных файлов задаётся параметром -i в командной строке GHCi, например:
ghci -idir1:...:dirn
или его можно установить с помощью команды :set внутри GHCi (см. Установка параметров командной строки GHC в GHCi) [4]
Следствием того, как GHCi отслеживает зависимости для поиска модулей, является то, что каждый модуль должен иметь исходный файл. Единственное исключение — модули, которые поступают из пакета, включая Prelude и стандартные библиотеки, такие как IO и Complex. Если вы попытаетесь загрузить модуль, для которого GHCi не может найти исходный файл, даже если существуют объектные и интерфейсные файлы для модуля, вы получите сообщение об ошибке.
Обратите внимание, что в GHCi и режиме --make параметр -i используется для указания пути поиска исходных файлов, а в стандартном режиме пакетной компиляции параметр -i используется для указания пути поиска интерфейсных файлов, см. Путь поиска.
3.2.2. Внесение изменений и перекомпиляция
Если вы внесли изменения в исходный код и хотите, чтобы GHCi перекомпилировал программу, введите команду :reload. Программа будет перекомпилирована по мере необходимости, и GHCi постарается избежать фактической перекомпиляции модулей, если их внешние зависимости не изменились. Этот механизм используется для избежания перекомпиляции модулей в режиме пакетной компиляции (см. Проверка перекомпиляции).