Денис Шевченко 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 бытует мнение о чрезвычайной, пря мо-таки фантастической сложности его освоения. И всё-таки я повторю: в этом языке меня поразила его простота. Но простота эта особенная, и скоро вы пой мёте, что я имею в виду.