Учебник по Haskell - [16]

Шрифт
Интервал

, который содержит много

полезных определений. К примеру там определяется тип 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> :q

Leaving 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

import Prelude(Bool(.. ), Show(.. ), Eq(.. ))

true :: Bool

true = True

false :: Bool

false = False

not :: Bool -> Bool

not True

= False

not False = True

and :: Bool -> Bool -> Bool

and False

_

= False

and True

x

= x

or

:: Bool -> Bool -> Bool

or True

_ = True

or False

x = x

xor :: Bool -> Bool -> Bool

xor a b = or (and (not a) b) (and a (not b))

ifThenElse :: Bool -> a -> a -> a

ifThenElse True

t

_ = t

ifThenElse False

_

e = e

Теперь сохраним модуль и загрузим его в интерпретатор. Для наглядности мы установим флаг +t, при

этом будет возвращено не только значение, но и его тип. Понабираем разные комбинации значений:

*Logic> :l Logic

[1 of 1] Compiling Logic

( Logic. hs, interpreted )

Ok, modules loaded: Logic.

*Logic> :set +t

*Logic> not (and true False)

True

it :: Bool

*Logic> or (and true true) (or False False)

True

it :: Bool

*Logic> xor (not True) (False)

False

it :: Bool

*Logic> ifThenElse (or true false) True False

True

it :: Bool

Логические значения | 27

Разумеется в Haskell уже определены логические операции, здесь мы просто тренировались. Они называ-

ются not, (&& ), ||. Операция xor это то же самое, что и (/=). Для Bool определён экземпляр класса Eq. Также

в Haskell есть конструкция ветвления она пишется так:

x = if cond then t else e

Слова if, then и else – ключевые. cond имеет тип Bool, а t и e одинаковый тип.

В коде программы обычно пишут так:

x = if a > 3

then ”Hello”

else (if a < 0

then ”Hello”

else ”Bye”)

Отступы обязательны.

Давайте загрузим в интерпретатор модуль


Рекомендуем почитать
Уголовное право. Особенная часть

В книге кратко изложены ответы на основные вопросы темы «Уголовное право. Особенная часть». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.


Уголовно-исполнительное право

В книге кратко изложены ответы на основные вопросы темы «Уголовно-исполнительное право». Издание поможет систематизировать знания, полученные на лекциях и семинарах, подготовиться к сдаче экзамена или зачета.Пособие адресовано студентам высших и средних образовательных учреждений, а также всем интересующимся данной тематикой.


Самоучитель Adobe Premiere 6.5

Книга посвящена возможностям самого популярного средства цифрового видеомонтажа – Adobe Premiere 6.5. Описываются основные приемы работы с программой, приводятся сведения об управлении проектами и клипами, обсуждаются методы монтажа видео и звука, техника создания титров и добавления спецэффектов, а также освещается процесс окончательного монтирования фильма. На примерах рассматриваются все этапы создания и обработки фильмов для телевидения, видео и мультимедиа.Для широкого круга пользователей.


Финансовое право

В учебном пособии в краткой и доступной форме рассмотрены все основные вопросы, предусмотренные государственным образовательным стандартом и учебной программой по дисциплине «Финансовое право».Книга позволит быстро получить основные знания по предмету, а также качественно подготовиться к зачету и экзамену.Рекомендуется студентам, аспирантам и преподавателям по юридическим, экономическим и управленческим специальностям, а также сотрудникам банков.Автор книги, Шевчук Денис Александрович, имеет опыт преподавания различных дисциплин в ведущих ВУЗах Москвы (экономические, юридические, технические, гуманитарные), два высших образования (экономическое и юридическое), более 30 публикаций (статьи и книги), Член Союза Юристов Москвы, Член Союза Журналистов России, Член Союза Журналистов Москвы, Стипендиат Правительства РФ, опыт работы в банках, коммерческих и государственных структурах (в т.ч.


фгос  ответы

Содержащиеся в пособии контрольно-измерительные материалы (КИМы) для 5 класса, аналогичные материалам ЕГЭ, составлены в соответствии с программой общеобразовательных учреждений по русскому языку и учитывают возрастные особенности учащихся. В конце пособия даны ответы на все варианты тестов, предложены диктанты различных типов.Пособие адресовано учителям, ученикам, их родителям и всем, кому необходимо закрепить и систематизировать знания перед ЕГЭ.


Теория литературы. Чтение как творчество

Цель предлагаемого пособия – систематизировать и обогатить представления о природе, структуре и особенностях художественной литературы как вида искусства, помочь совершенствованию читательского мастерства. Книга снабжена кратким словарем основных литературоведческих понятий и терминов (составлен при участии доцента О.В. Быстровой).Для студентов филологических факультетов, учителей, преподавателей литературы высших и средних учебных заведений.