Table Of ContentДенис Шевченко
Haskell
О
по-человечески
для обыкновенных программистов
О Haskell по-человечески
для обыкновенных программистов
издание 0.1
март 2014
© Шевченко Денис Васильевич
2014
Формат 70х100/16. Тираж ∞ экз.
Официальный сайт книги: http://ohaskell.ru
Содержание 3
Содержание
Часть 0 Лирическое вступление
Кто .......................................................................................................................... 11
Почему .................................................................................................................. 12
Зачем ...................................................................................................................... 13
Для кого ................................................................................................................ 14
Часть 1 Готовимся к работе
Создаём проект ................................................................................................... 17
Готовим структуру ..................................................................................................... 17
Настраиваем ............................................................................................................... 18
Конфигурируем ......................................................................................................... 20
Собираем ..................................................................................................................... 21
Запускаем .................................................................................................................... 21
О модулях, минимум ......................................................................................... 22
Импортируем ............................................................................................................. 22
Упоминаем .................................................................................................................. 23
Об именах .................................................................................................................... 24
О Hackage ............................................................................................................. 25
Ищем ............................................................................................................................ 25
Устанавливаем ............................................................................................................ 25
Добавляем в проект ................................................................................................... 26
Импортируем модули .............................................................................................. 26
О прелюдии ................................................................................................................ 26
Часть 2 Несколько слов о Haskell
Чистая функциональность ............................................................................... 29
Три кита типизации .......................................................................................... 30
Содержание 4
Кит первый ................................................................................................................. 30
Кит второй .................................................................................................................. 30
Кит третий .................................................................................................................. 31
Неизменность данных ....................................................................................... 32
Лень ........................................................................................................................ 33
Начнём с C++ .............................................................................................................. 33
А вот как в Haskell ..................................................................................................... 34
Часть 3 О функциях
Чистые функции ................................................................................................. 39
Объявляем ................................................................................................................... 39
Определяем ................................................................................................................ 40
Вызываем ..................................................................................................................... 41
Выход из функции ..................................................................................................... 41
Стража! ........................................................................................................................ 43
Локальные выражения ............................................................................................. 44
Без объявления ........................................................................................................... 45
λ-функции ............................................................................................................ 47
Что это такое .............................................................................................................. 47
Как это выглядит в коде ........................................................................................... 48
Множество аргументов ............................................................................................. 49
Какая от них польза .................................................................................................. 49
Функции высшего порядка .............................................................................. 51
Разоблачение функций ............................................................................................ 51
Частичное применение функции .......................................................................... 53
Зачем это нужно ........................................................................................................ 54
Функциональные цепочки ................................................................................ 59
Пример с URL ............................................................................................................. 59
Функция композиции ............................................................................................... 60
Функция применения ............................................................................................... 61
Вместе ........................................................................................................................... 61
Содержание 5
Часть 4 О списках
Списки — одним взглядом .............................................................................. 65
Простейшие действия .............................................................................................. 65
Неизменность списка ................................................................................................ 66
Действия над элементами ....................................................................................... 67
Диапазоны ............................................................................................................ 68
Суть ............................................................................................................................... 68
Умные диапазоны ...................................................................................................... 68
Без конца ..................................................................................................................... 69
Кортежи ................................................................................................................ 71
Что с ними можно делать ........................................................................................ 72
Неудобный способ ..................................................................................................... 72
Удобный способ ......................................................................................................... 73
List comprehension .............................................................................................. 75
Хитрый список ........................................................................................................... 75
Добавляем предикат ................................................................................................. 76
Больше списков .......................................................................................................... 77
Добавляем условие .................................................................................................... 78
Пример ........................................................................................................................ 78
Часть 5 Пользовательские типы
Типы — одним взглядом .................................................................................. 83
Собственный тип ....................................................................................................... 83
Класс типов ................................................................................................................. 84
Экземпляр класса типов .......................................................................................... 85
О конструкторах значений ............................................................................... 86
Иные имена ................................................................................................................. 86
Множество конструкторов ....................................................................................... 86
О нульарных конструкторах .................................................................................... 87
Контекст типа ...................................................................................................... 89
Любой, да не совсем .................................................................................................. 89
Множественность ....................................................................................................... 90
Составные типы .................................................................................................. 92
Поля .............................................................................................................................. 92
Содержание 6
Что с ними можно делать ........................................................................................ 93
Укороченная запись типов полей .......................................................................... 94
Конструктор типа ...................................................................................................... 95
Наследуемые типы ............................................................................................. 97
Наследуем ................................................................................................................... 97
Eq и Ord ........................................................................................................................ 99
Enum ............................................................................................................................... 99
Bounded ....................................................................................................................... 100
Read и Show ................................................................................................................ 101
Собственные классы типов ............................................................................. 103
Перцы ......................................................................................................................... 103
Зачем они нужны ..................................................................................................... 104
Константы .................................................................................................................. 104
Новый тип .......................................................................................................... 106
Один конструктор значения .................................................................................. 106
Одно поле .................................................................................................................. 106
Для чего он нужен ................................................................................................... 107
Часть 6 Ввод и вывод
Функции с побочными эффектами ............................................................. 109
Чистота vs нечистота .............................................................................................. 109
Действие vs бездействие ......................................................................................... 109
IO a ........................................................................................................................ 111
Стандартные ввод и вывод ..................................................................................... 111
Объявляем main ........................................................................................................ 112
Совместная работа ................................................................................................... 112
do: императивный мир ................................................................................... 114
Не только main .......................................................................................................... 115
О функции return ................................................................................................... 115
Обработка исключений ................................................................................... 118
Проблема с файлом ................................................................................................ 118
Ловим ......................................................................................................................... 119
Ловим наоборот ....................................................................................................... 120
Пытаемся ................................................................................................................... 120
В чистом мире .......................................................................................................... 122
Содержание 7
Собственные исключения ............................................................................... 123
Создаём ...................................................................................................................... 123
Бросаем ...................................................................................................................... 124
Часть 7 Деликатесы
Монады: суть ...................................................................................................... 127
Почему их так боятся .............................................................................................. 127
Определение ............................................................................................................. 127
Иллюстрация ............................................................................................................ 128
Монады: на примере IO .................................................................................. 129
Класс типов Monad .................................................................................................... 129
Компоновка ............................................................................................................... 129
Затем ........................................................................................................................... 131
return ......................................................................................................................... 131
fail ............................................................................................................................. 132
Монады: практика ............................................................................................ 133
Разоблачение списков ............................................................................................. 133
Меняем тип ............................................................................................................... 135
Зеркальная компоновка ......................................................................................... 136
Может быть ........................................................................................................ 137
Что за зверь ............................................................................................................... 137
Для чего он ................................................................................................................ 137
Ещё и монада ............................................................................................................ 138
Функторы ............................................................................................................ 140
Разбираемся .............................................................................................................. 140
Зачем это нам ........................................................................................................... 140
Создаём свой ............................................................................................................. 141
Часть 8 Остальное
О модулях ........................................................................................................... 145
Об иерархии ............................................................................................................. 145
О лице ........................................................................................................................ 146
Ничего, кроме… ....................................................................................................... 147
Всё, кроме… .............................................................................................................. 147
Принадлежность ...................................................................................................... 148
Содержание 8
Короткая принадлежность .................................................................................... 148
Обязательная принадлежность ............................................................................ 148
О модуле Main ........................................................................................................... 149
Рекурсивные функции ..................................................................................... 150
Сама себя ................................................................................................................... 150
Основное правило ................................................................................................... 151
Погружаемся ............................................................................................................ 151
Всплываем ................................................................................................................. 153
Про апостроф .................................................................................................... 155
О форматировании .......................................................................................... 156
Функция ..................................................................................................................... 156
Тип .............................................................................................................................. 158
Класс типов ............................................................................................................... 159
Константа ................................................................................................................... 160
Условие ...................................................................................................................... 160
Локальные выражения ........................................................................................... 162
Вывод .......................................................................................................................... 162
Заключение
И что, это всё?? .................................................................................................. 165
Благодарности ................................................................................................... 166
Часть 0 Лирическое вступление
Кто 11
Кто
«Я, барон Мюнхгаузен, обыкновенный человек…»
барон
А
я, подобно Мюнхгаузену, обыкновенный программист. Самый заурядный
самоучка. Когда-то я считал программирование самым скучным видом
человеческой деятельности. Последние семь лет я считаю его одним из наиболее
интересных дел.
Фредерик Брукс был прав, серебряной пули не существует. И всё же програм
мисты-практики ищут новые инструменты для решения своих непростых задач.
Вот и я, после 7 лет опыта программирования на C++, решил искать нечто
новое, и именно ради стремления к большей эффективности.
Признаюсь, я начал уставать от сложности C++. Захотелось мне чего-нибудь
эдакого. Компилируемость, строгость к типам, высокоуровневые конструкции,
красивый синтаксис, универсальность и… что-нибудь попроще. Да, я хотел
именно этого. Под руку случайно подвернулся Haskell — и зацепил меня сразу.
Во-первых, отсутствие оператора присваивания. Признаюсь, крышу мне сне
сло напрочь, и я решил разобраться.
Во-вторых, красота. Я люблю красивый код, а, как выяснилось, код на Haskell
может быть очень красивым.
В-третьих, мощь. Продолжайте читать, и чуть позже вы сами в этом убеди
тесь.
И наконец, простота. Нет, я не оговорился. Мне известно, что к функциональ
ному программированию эпитет «простое» применяется чуть реже, чем
никогда. В частности, в отношении Haskell бытует мнение о чрезвычайной, пря
мо-таки фантастической сложности его освоения. И всё-таки я повторю: в этом
языке меня поразила его простота. Но простота эта особенная, и скоро вы пой
мёте, что я имею в виду.