:set +s
После выполнения команды интерпретатор будет выводить на экран не только результат вычисле-ния выражения, но и статистику вычислений.
:l ИмяМодуля
Загружает модуль в интерпретатор.:cd Директория
Перейти в данную директорию.:r
Перезагружает, последний загруженный модуль. Этой командой можно пользоваться после внесения вмодуль изменений.
:q
Выход из интерпретатора.2.2 У-вей
Согласно даосам основной принцип жизни заключается в недеянии (у-вей). Всё происходит естественно и
словно само собой. Давайте создадим модуль который ничего не делает. Создадим пустой модуль и загрузим
его в интерпретатор.
module Empty where
import Prelude
()| 25
Зачем мы написали import Prelude
()? Этой фразой мы говорим, что не хотим ничего импортироватьиз модуля Prelude
. По умолчанию в любой модуль загружается модуль Prelude, который содержит многополезных определений. К примеру там определяется тип Bool
, списки и функции для них, символы, классытипов для сравнения на равенство и печати значений и много, много других определений. В первых главах
я хочу сделать акцент на самом языке Haskell, а не на производных выражениях, поэтому пока мы будем в
явном виде загружать из модуля Prelude
лишь самые необходимые определения.Сохраним модуль в файле Empty.
hs, сделаем директорию модуля текущей и запустим интерпретаторкомандой ghci Empty
(имя расширения можно не писать). Также можно просто запустить интерпретаторкомандой ghci, переключиться на директорию командой :
cd и загрузить модуль командой :l Empty.$ ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/
:? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :cd ~/haskell-notes/code/ch-2/
Prelude> :l Empty.hs
[1 of 1] Compiling Empty
( Empty.hs, interpreted )
Ok, modules loaded: Empty.
*Empty>
Слева от знака приглашения к вводу >
отображаются загруженные в интерпретатор модули. По умол-чанию загружается модуль Prelude
. После выполнения команды :l мы видим, что Prelude сменилось наEmpty
.Теперь давайте потренируемся перезагружать модули. Давайте изменим наш модуль, сделаем его не та-
ким пустым, убрав последние две скобки от модуля Prelude
в директиве import. Теперь сохраним измененияи выполним команду :
r.*Empty> :
r[1 of
1] Compiling Empty( Empty.
hs, interpreted )Ok
, modules loaded: Empty.*Empty>
Завершим сессию интерпретатора командой :
q.*Empty> :
qLeaving GHCi.
Внешние модули должны находится в текущей директории. Давайте потренируемся с подключением
определений из внешних модулей. Создадим модуль близнец модуля Empty.
hs:module EmptyEmpty where
import Prelude
()И сохраним его в той же директории, что и модуль Empty
, теперь мы можем включить все определенияиз модуля EmptyEmpty
:module Empty where
import EmptyEmpty
Когда у нас будет много модулей мы можем разместить их по директориям. Создадим в одной дирек-
тории с модулем Empty
директорию Sub, а в неё поместим копию модуля Empty. Существует одна тонкость:поскольку модуль находится в поддиректории, для того чтобы он стал виден из текущей директории, необ-
ходимо дописать через точку имя директории в которой он находится:
module Sub.Empty where
Теперь мы можем загрузить этот модуль из исходного:
module Empty where
import EmptyEmpty
import Sub.Empty
Обратите внимание на то, что мы приписываем к модулю в поддиректории Sub
имя поддиректории. Еслибы он был заложен в ещё одной директории, то мы написали бы через точку имя и этой поддиректории:
module Empty where
import Sub1.Sub2.Sub3.Sub4.Empty
26 | Глава 2: Первая программа
2.3 Логические значения
Пустой модуль это хорошо, но слишком скучно. Давайте перепишем объявленные в этой главе опреде-
ления в модуль, загрузим его в интерпретатор и понабираем значения.
Начнём с логических операций. Давайте не будем переопределять Bool
, Show и Eq, а просто возьмём ихиз Prelude
:module Logic where
import Prelude
(Bool(.. ), Show(.. ), Eq(.. ))Две точки в скобках означают “все конструкторы” (в случае типа) и “все методы” (в случае класса типа).
Строчку
import Prelude
(Bool(.. ), Show(.. ), Eq(.. ))Следует читать так: Импортируй из модуля Prelude
тип Bool и все его конструкторы и классы Show иEq
со всеми их методами. Если бы мы захотели импортировать только конструктор True, мы бы написалиBool
(True), а если бы мы захотели импортировать лишь имя типа, мы бы написали просто Bool без скобок.Сначала выпишем в модуль наши синонимы:
module Logic where