haskell-notes

13 мы напишем программу для игры в пятнашки, а в главе 21 – midi-секвенсор и немного музыки.

Рекомендую сначала изучить основы языка, а затем обращаться к остальным частям в любом порядке.

Основные понятия

Haskell – чисто функциональный, типизированный язык программирования. Я буду очень часто говорить

слова функция, типы, значения, типы, функция, функция, типы~– буквально постоянно. Перед тем как мы

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

Мы собираемся изучить новый язык, хоть и искусственный, но всё же язык. Языки служат описанию яв-

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

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

называть значениями, а другие говорят о самих описаниях. Например это слова “числа”, “цвета” или “люди”.

Есть конкретное число: один два или три, а есть все числа. Такие описания мы будем называть типами. Типы

описывают множество значений. Функции описывают одни значения через другие. Это такие шаблоны описа-

ний. Типичный пример функции, это “вычисление площади треугольника”. Функция как бы говорит: если ты

мне покажешь треугольник, то я тебе скажу его площадь (число). Функция “вычисление площади треуголь-

ника” связывает два типа между собой: тип всех треугольников и тип чисел (значение площади). Могут быть

и не математические функции. Например функция “цвет глаз” говорит нам: если ты покажешь мне челове-

ка, то я скажу какого цвета у него глаза. Эта функция связывает тип “люди” и тип “цвет”. При этом связь

имеет направление. Функция сначала спрашивает у нас, чего ей не хватает, а потом говорит ответ. Ответ

называют значением функции (или выходом функции), а то чего ей не хватает аргументами функции (или

входами). Математики говорят, что эта функция отображает значения типа “люди” в значения типа “цвет”.

В Haskell функции тоже являются значениями. Функция может принимать в качестве аргумента функцию и

возвращать функцию.

Функции бывают чистыми и с побочными эффектами. Чистые функции – это правдивые функции. Их основ-

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

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

Коли? В один день она может сказать голубые, а в другой зелёные. В Haskell таким функциям не доверяют и

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

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

Я бы хотел поблагодарить родителей за терпение и поддержку, сообщество 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162