00. Введение

Что такое Haskell?

Haskell — это, прежде всего, чисто-функциональный язык программирования. В привычных вам языках, программа представляет собой некую последовательность действий, которые каким-то образом влияют на состояние объектов программы и внешний мир. Например, вы можете создать глобальную переменную x = 5, а затем изменить ее значение. В таких языках присутствуют различные условные операторы и операторы циклов, которые позволяют построить достаточно сложную логику выполнения программы.

В чисто-функциональных языках программирования переменные и функции носят математический смысл: если вы сказали, что x = 5, то x не может вдруг изменить свое значение. Везде, в своей области видимости, x будет равно 5. Таким образом, поскольку переменные не могут изменяться, все функции автоматически получаются чистыми, то есть без побочных эффектов. На первый взгляд, может показаться, что это сильно ограничивает возможности языка. Однако, при более внимательном рассмотрении оказывается, чистые функции имеют свои преимущества. Например, чистые функции, как и функции в математическом смысле, при одних и тех же параметрах всегда будут возвращать один и тот же результат. Во-первых, это может быть проанализировано компилятором и он может избавиться от повторяющихся вычислений. Во-вторых, это также позволяет программисту легко проанализировать и доказать корректность небольших функций, из которых он затем сможет составлять все более сложные конструкции.

Haskell — это язык программирования с ленивым порядком вычислений. Опять же, в привычных вам языках программирования, при вызове функции сначала вычисляются ее аргументы, а затем выполняется тело функции. Такой способ вычисления называется энергичным. При ленивом порядке вычислений, аргументы функции остаются в невычисленном виде до тех пор, пока не понадобится их реальное значение. При этом каждый аргумент или переменная будет вычислена максимум один раз. В Haskell это имеет большое значение: поскольку язык чисто-функциональный, вычислять выражение дважды бессмысленно. Ленивые вычисления часто позволяют избегать лишних вычислений, при этом чистые функции позволяют не держать в голове реальный порядок, в котором функции будут вычисляться. Помимо этого, ленивые вычисления позволяют вводить такие абстракции, как бесконечные структуры данных.

Haskell — статически типизированный язык программирования. Это значит, что любое выражение в Haskell имеет свой определенный тип. Системы типов Haskell очень выразительна и имеет мощный аппарат автоматического вывода типов. Мощная система типов Haskell позволяет опеределить большинство ошибок в программе еще на этапе компиляции. Автоматический вывод в Haskell позволяет избежать лишних объявлений типов. Например, если вы напишете x = 2 + 3, компилятор поймет, что, сложив два числа, вы получите число, поэтому x будет числом.

Дополнительные материалы

На странице Tutorials на официальном сайте Haskell предоставлены ссылки на туториалы, обучающие и мотивирующие материалы. Здесь представлена выдержка из этого списка, которую я бы рекомендовал к изучению в первую очередь.

Туториалы и обучающий материал по языку Haskell

Learn you A Haskell — это позитивно и понятно изложенный материал, начиная с самых основ и заканчивая введением в интересные вещи (Functor, Applicative, Monad, Zipper). Доступен перевод на русский язык.

Yet Another Haskell Tutorial — классически изложенный материал, более полно раскрывающий особенности языка.

Haskell Wikibook — нечто среднее между справочником и туториалом по языку Haskell. В книге содержатся статьи по "продвинутым" темам, включая структуры данных, теорию типов и статьи о производительности программ на Haskell.

Язык Haskell: о пользе и вреде лени — русскоязычный учебник программирования на языке Haskell, объясняющий самые основы.

Почему стоит изучать Haskell?

Why Haskell matters — хорошее обсуждение преимуществ Haskell (с примерами).

Why functional programming matters — раскрывает преимущества функциональных языков программирования и демонстрирует как функции высшего порядка и ленивые вычисления позволяют структурировать программу.