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

плане вам будет гораздо проще. Если вы всё же не начинающий, попробуйте подойти к материалу этой книги

с открытым сердцем. Не ищите в 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 таким функциям не доверяют и

огораживают их от чистых функций, но я увлёкся, обо всём об этом вы узнаете из этой книги.