плане вам будет гораздо проще. Если вы всё же не начинающий, попробуйте подойти к материалу этой книги
с открытым сердцем. Не ищите в Haskell элементы вашего любимого языка и, возможно, таким языком станет
Haskell.
Ещё одна трудность связана с тем, что многие понятия тесно переплетены, Haskell не так просто разбить
на маленькие части и изучать их от простого к сложному, уже в самых простейших элементах кроются черты
новых и непривычных идей. Но, я надеюсь, что мы сможем преодолеть и этот барьер, мы не будем изучать
Haskell по кусочкам, а окунёмся в него с головой, уже в первой главе мы пробежимся по всему языку и далее
будем углубляться в отдельные моменты.
В книге много примеров. Haskell оснащён интерпретатором. Интерпретатор (также называемый REPL, от
англ. read-eval-print loop) позволяет писать программы в диалоговом режиме. Мы набираем выражение языка
и сразу видим ответ – вычисленное значение. Интерпретатор поможет нам разобраться во многих тонкостях
языка. Мы будем обращаться к нему очень часто.
Книгу можно разбить на несколько частей:
• Основы языка (1-13). Из первых тринадцати глав вы узнаете, что такое Haskell и чем он хорош.
• Теоретическая часть (14-16). Haskell питается соками математики, многие красивые научные идеи не
только находят в нём воплощение, но и являются фундаментом языка. Из этих глав вы узнаете немного
теории, которая служила источником вдохновения разработчиков Haskell.
• Разработка на Haskell (10,17-20). В этих главах мы познакомимся с расширениями языка (17), мы узна-
ем как писать библиотеки и документацию (18), проводить тестирование и оценивать быстродействие
программ (19), также мы потренируемся в написании императивного кода на Haskell (20). Из главы 10
мы узнаем как работает GHC, основной компилятор для Haskell.
Предисловие | 11
• Примеры (13, 21). В этих главах мы посмотрим на несколько примеров применения Haskell. В глваве
13 мы напишем программу для игры в пятнашки, а в главе 21 – midi-секвенсор и немного музыки.
Рекомендую сначала изучить основы языка, а затем обращаться к остальным частям в любом порядке.
Основные понятия
Haskell – чисто функциональный, типизированный язык программирования. Я буду очень часто говорить
слова функция, типы, значения, типы, функция, функция, типы~– буквально постоянно. Перед тем как мы
окунёмся с головой в программный код, я бы хотел словами пояснить, что всё это значит.
Мы собираемся изучить новый язык, хоть и искусственный, но всё же язык. Языки служат описанию яв-
лений, словами мы можем зафиксировать мысли и чувства и передать их другому. Предложение языка опи-
сывает что-то. У нас будут два разных вида описаний. Одни говорят о чём-то конкретном, их мы будем
называть значениями, а другие говорят о самих описаниях. Например это слова “числа”, “цвета” или “люди”.
Есть конкретное число: один два или три, а есть все числа. Такие описания мы будем называть типами. Типы
описывают множество значений. Функции описывают одни значения через другие. Это такие шаблоны описа-
ний. Типичный пример функции, это “вычисление площади треугольника”. Функция как бы говорит: если ты
мне покажешь треугольник, то я тебе скажу его площадь (число). Функция “вычисление площади треуголь-
ника” связывает два типа между собой: тип всех треугольников и тип чисел (значение площади). Могут быть
и не математические функции. Например функция “цвет глаз” говорит нам: если ты покажешь мне челове-
ка, то я скажу какого цвета у него глаза. Эта функция связывает тип “люди” и тип “цвет”. При этом связь
имеет направление. Функция сначала спрашивает у нас, чего ей не хватает, а потом говорит ответ. Ответ
называют значением функции (или выходом функции), а то чего ей не хватает аргументами функции (или
входами). Математики говорят, что эта функция отображает значения типа “люди” в значения типа “цвет”.
В Haskell функции тоже являются значениями. Функция может принимать в качестве аргумента функцию и
возвращать функцию.
Функции бывают чистыми и с побочными эффектами. Чистые функции – это правдивые функции. Их основ-
ная особенность в том, что для одинаковых ответов на их вопросы, они скажут одинаковые ответы. Функции
с побочными эффектами так не делают, например если мы спросим у такой функции какого цвета глаза у
Коли? В один день она может сказать голубые, а в другой зелёные. В Haskell таким функциям не доверяют и
огораживают их от чистых функций, но я увлёкся, обо всём об этом вы узнаете из этой книги.