Выбрать главу

Благодарности

Я бы хотел поблагодарить родителей за терпение и поддержку, сообщество Haskell, всех тех людей, у

которых я мог свободно учится языку Haskell. Когда я только начинал мне очень помогли книга Мирана

Липовача (Miran Lipovaca) Learn You A Haskell for a Great Good и книга Хал Дама (Hal Daume III) Yet another

Haskell Tutorial. Спасибо Дмитрию Астапову, Дугласу Мак Илрою (Douglas McIlroy) и Джону Хьюзу (John

Huges) за великодушное согласие на использование примеров из их статей. Большое спасибо Кате Столяро-

вой за идею написания книги. Спасибо Александру Мозгунову за расширение моего кругозора в Haskell и не

только. Спасибо Оксане Станевич за редактирование и правки первой главы.

Хочется поблагодарить тех, кто присылал правки, после появления первой версии книги. Огромное спа-

сибо Андрею Мельникову. Его поддержка и замечания значительно углубили материал книги, вывели её

на новый уровень. Книга сильно изменилась после комментариев Владимира Шабанова (появились части о

сборщике мусора). Многие правки внесли Сергей Дмитриев и Кирилл Заборский. Также хотелось бы отме-

тить тех, кто вносил правки через github и ru_declarative: lionet, d_ao, odrdo, ul.

Технические благодарности: команде GHC, за компилятор Haskell, Джону Мак Фарлану (John MacFarlane)

за систему вёрстки pandoc, команде TexLive, авторам XeLatex, автору пакета hscolour Малькольму Уолласу

(Malcolm Wallace) за подсветку синтаксиса, авторам пакетов c Hackage: diagrams (Брент Йорги (Brent Yorgey),

Райан Йэйтс (Ryan Yates)) QuickCheck (Коэн Клаессен (Koen Claessen), Бьорн Брингерт (Bjorn Bringert), Ник

Смолбоун (Nick Smallbone)), criterion (Брайан О’Салливан (Bryan O’Sullivan)), HCodecs (Джордж Гиоргадзе

(George Giorgidze)), fingertree (Росс Патерсон (Ross Paterson), Ральф Хинце (Ralf Hinze)), Hipmunk (Фелипе

Лесса (Felipe A. Lessa)), OpenGL (Джэйсон Даджит (Jason Dagit), Свен Пэнн (Sven Panne) и GLFW (Пол Лю

(Paul H. Liu), Марк Санет (Marc Sunet)).

12 | Предисловие

Глава 1

Основы

Есть мнение, что Haskell очень большой язык. Это и правда так. В Haskell много разных конструкций,

синтаксического сахара, которые делают код более наглядным. Также в Haskell много библиотек на раз-

ные случаи жизни. Однако, обману ли я ваши ожидания, сказав, что всё это имеет достаточно компактную

основу? Это и правда так, вам осталось лишь убедиться в наглядности и простоте Haskell. В этой главе мы

пробежимся по нему, охватив одним взглядом целиком весь язык. Несколько наглядных конструкций, немно-

го моих пояснений, и вы поймёте, что к чему. Если что-то сразу не станет ясно, или где-то я опущу какие-то

пояснения, будьте уверены – в следующих главах мы обязательно обратимся к этим моментам и обсудим их

подробнее.

1.1 Общая картина

Программы на Haskell бывают двух видов: это приложения (executable) и библиотеки (library). Приложе-

ния представляют собой исполняемые файлы, которые решают некоторую задачу, к примеру – это может

быть компилятор языка, сортировщик данных в директориях, календарь, или цитатник на каждый день, лю-

бая полезная утилита. Библиотеки тоже решают задачи, но решают их внутри самого языка. Они содержат

отдельные значения, функции, которые можно подключать к другой программе Haskell, и которыми можно

пользоваться.

Программа состоит из модулей (module). И здесь работает правило: один модуль – один файл. Имя модуля

совпадает с именем файла. Имя модуля начинается с большой буквы, тогда как файлы имеют расширение

. hs. Например FirstModule. hs. Посмотрим на типичный модуль в Haskelclass="underline"

--------------------------------------

-- шапка

module Имя(определение1, определение2,..., определениеN) where

import Модуль1(... )

import Модуль2(... )

...

---------------------------------------

-- определения

определение1

определение2

...

Каждый модуль содержит набор определений. Относительно модуля определения делятся на экспорти-

руемые и внутренние. Экспортируемые определения могут быть использованы за пределами модуля, а внут-

ренние – только внутри модуля, и обычно они служат для выражения экспортируемых определений.

Модуль состоит из двух частей – шапки и определений.

Шапка В шапке после слова module объявляется имя модуля, за которым в скобках следует список экспорти-

руемых определений; после скобок стоит слово where. Затем идут импортируемые модули. С помощью

импорта модулей вы имеете возможность в данном модуле пользоваться определениями из другого

модуля.

Как после имени модуля, так и в директиве import скобки с определениями можно не писать,так как