Изучай Haskell во имя добра!
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Автор:
Липовача Миран
Год издания: 2023
Кол-во страниц: 492
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Дополнительное образование
ISBN: 978-5-89818-338-7
Артикул: 816359.01.99
На взгляд автора, сущность программирования заключается в решении проблем. Программист всегда думает о проблеме и возможных решениях — либо пишет код для выражения этих решений. Язык Haskell имеет множество впечатляющих возможностей, но главное его свойство в том, что меняется не только способ написания кода, но и сам способ размышления о проблемах и возможных решениях. Этим Haskell действительно отличается от большинства языков программирования. С его помощью мир можно представить и описать нестандартным образом. И поскольку Haskell предлагает совершенно новые способы размышления о проблемах, изучение этого языка может изменить и стиль программирования на всех прочих. Еще одно необычное свойство Haskell состоит в том, что в этом языке придается особое значение рассуждениям о типах данных. Как следствие, вы помещаете больше внимания и меньше кода в ваши программы. Вне зависимости от того, в каком направлении вы намерены двигаться, путешествуя в мире программирования, небольшой заход в страну Haskell себя оправдает. А если вы решите там остаться, то наверняка найдете чем заняться и чему поучиться! Эта книга поможет многим читателям найти свой путь к Haskell.
- Полная коллекция по информатике и вычислительной технике
- ДМК Пресс. Информационные системы и технологии
- ДМК Пресс. ИТ-технологии для профессионалов
- Интермедиатор. Информационные системы и технологии (сводная)
- Интермедиатор. ИТ-технологии для профессионалов (сводная)
- Программирование
- Программирование и алгоритмизация
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Миран Липовача Изучай Haskell во имя добра! Москва, 2023
Learn You a Haskell for Great Good! A Beginner’s Guide Miran Lipovacˇa San Francisco
Изучай Haskell во имя добра! Миран Липовача Москва, 2023 2-е издание, электронное
УДК 004.432.42Haskell ББК 32.973.28-018.1 Л61 Л61 Липовача, Миран. Изучай Haskell во имя добра! / М. Липовача ; пер. с англ. Д. Леушина, А. Синицына, Я. Арсанукаева. — 2-е изд., эл. — 1 файл pdf : 492 с. — Москва : ДМК Пресс, 2023. — Систем. требования: Adobe Reader XI либо Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный. ISBN 978-5-89818-338-7 На взгляд автора, сущность программирования заключается в решении проблем. Программист всегда думает о проблеме и возможных решениях — либо пишет код для выражения этих решений. Язык Haskell имеет множество впечатляющих возможностей, но главное его свойство в том, что меняется не только способ написания кода, но и сам способ размышления о проблемах и возможных решениях. Этим Haskell действительно отличается от большинства языков программирования. С его помощью мир можно представить и описать нестандартным образом. И поскольку Haskell предлагает совершенно новые способы размышления о проблемах, изучение этого языка может изменить и стиль программирования на всех прочих. Еще одно необычное свойство Haskell состоит в том, что в этом языке придается особое значение рассуждениям о типах данных. Как следствие, вы помещаете больше внимания и меньше кода в ваши программы. Вне зависимости от того, в каком направлении вы намерены двигаться, путешествуя в мире программирования, небольшой заход в страну Haskell себя оправдает. А если вы решите там остаться, то наверняка найдете чем заняться и чему поучиться! Эта книга поможет многим читателям найти свой путь к Haskell. УДК 004.432.42Haskell ББК 32.973.28-018.1 Электронное издание на основе печатного издания: Изучай Haskell во имя добра! / М. Липовача ; пер. с англ. Д. Леушина, А. Синицына, Я. Арсанукаева. — Москва : ДМК Пресс, 2014. — 492 с. — ISBN 978-597060-025-2. — Текст : непосредственный. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации. ISBN 978-5-89818-338-7 © Miran Lipovaca, No Starch Press, Inc. © Оформление, перевод на русский язык, ДМК Пресс, 2014
Оглавление От издателя .............................................................12 Предисловие ...........................................................13 Введение ................................................................16 1. На старт, внимание, марш! .....................................21 Вызов функций .............................................................................. 24 Функции: первые шаги .................................................................. 25 Списки .......................................................................................... 26 Конкатенация .................................................................................29 Обращение к элементам списка .....................................................30 Списки списков ..............................................................................31 Сравнение списков .........................................................................31 Другие операции над списками ......................................................32 Интервалы .................................................................................... 35 Генераторы списков ...................................................................... 37 Кортежи ........................................................................................ 41 Использование кортежей ...............................................................42 Использование пар .........................................................................43 В поисках прямоугольного треугольника ........................................44 2. Типы и классы типов ..............................................46 Поверь в типы ............................................................................... 46 Явное определение типов ............................................................. 47 Обычные типы в языке Haskell ....................................................... 48 Типовые переменные .................................................................... 50 Классы типов ................................................................................ 51 Класс Eq .........................................................................................52 Класс Ord .......................................................................................53 Класс Show .....................................................................................54 Класс Read .....................................................................................54 Класс Enum ....................................................................................56 Класс Bounded ...............................................................................56 Класс Num ......................................................................................57
ОГЛАВЛЕНИЕ 6 Класс Floating .................................................................................58 Класс Integral ..................................................................................58 Несколько заключительных слов о классах типов .......................... 59 3. Синтаксис функций ...............................................60 Сопоставление с образцом ........................................................... 60 Сопоставление с парами ................................................................62 Сопоставление со списками и генераторы списков ........................63 Именованные образцы ...................................................................66 Эй, стража!.................................................................................... 67 Где же ты, where?! ......................................................................... 69 Область видимости декларации where ...........................................71 Сопоставление с образцами в секции where ...................................72 Функции в блоке where ...................................................................72 Пусть будет let ............................................................................... 73 Выражения let в генераторах списков .............................................75 Выражения let в GHCi ......................................................................75 Выражения для выбора из вариантов ............................................ 76 4. Рекурсия .............................................................78 Привет, рекурсия! ......................................................................... 78 Максимум удобства ...................................................................... 79 Ещё немного рекурсивных функций .............................................. 81 Функция replicate ............................................................................81 Функция take ..................................................................................81 Функция reverse ..............................................................................82 Функция repeat ...............................................................................83 Функция zip ....................................................................................83 Функция elem .................................................................................84 Сортируем, быстро!.. .................................................................... 84 Алгоритм ........................................................................................85 Определение ..................................................................................86 Думаем рекурсивно ...................................................................... 87 5. Функции высшего порядка ......................................89 Каррированные функции ............................................................... 89 Сечения ..........................................................................................92 Печать функций ..............................................................................93 Немного о высоких материях ......................................................... 94 Реализация функции zipWith ...........................................................95 Реализация функции flip .................................................................96 Инструментарий функционального программиста ........................ 98 Функция map ..................................................................................98 Функция filter ..................................................................................99 Ещё немного примеров использования map и filter .......................100 Функция map для функций нескольких переменных ......................103
ОГЛАВЛЕНИЕ Лямбда-выражения ..................................................................... 104 Я вас сверну! ............................................................................... 106 Левая свёртка foldl ........................................................................107 Правая свёртка foldr .....................................................................108 Функции foldl1 и foldr1 ..................................................................110 Примеры свёрток .........................................................................111 Иной взгляд на свёртки ................................................................112 Свёртка бесконечных списков ......................................................113 Сканирование...............................................................................114 Применение функций с помощью оператора $ ............................ 115 Композиция функций .................................................................. 117 Композиция функций с несколькими параметрами .......................118 Бесточечная нотация ....................................................................120 6. Модули..............................................................122 Импорт модулей ......................................................................... 123 Решение задач средствами стандартных модулей ...................... 125 Подсчёт слов ................................................................................125 Иголка в стоге сена ......................................................................127 Салат из шифра Цезаря ................................................................129 О строгих левых свёртках .............................................................130 Поищем числа ..............................................................................132 Отображение ключей на значения ............................................... 135 Почти хорошо: ассоциативные списки ..........................................135 Модуль Data.Map ..........................................................................137 Написание собственных модулей ................................................ 142 Модуль Geometry ..........................................................................143 Иерархия модулей ........................................................................145 7. Создание новых типов и классов типов ...................148 Введение в алгебраические типы данных .................................... 148 Отличная фигура за 15 минут ...................................................... 149 Верный способ улучшить фигуру ..................................................151 Фигуры на экспорт .......................................................................153 Синтаксис записи с именованными полями ................................ 154 Параметры типа .......................................................................... 157 Параметризовать ли машины? .....................................................160 Векторы судьбы ............................................................................162 Производные экземпляры ........................................................... 163 Сравнение людей на равенство ....................................................164 Покажи мне, как читать .................................................................165 Порядок в суде! ............................................................................167 Любой день недели ......................................................................168 Синонимы типов.......................................................................... 170 Улучшенная телефонная книга ......................................................170
ОГЛАВЛЕНИЕ 8 Параметризация синонимов .........................................................172 Иди налево, потом направо ..........................................................173 Рекурсивные структуры данных ................................................... 176 Улучшение нашего списка ............................................................177 Вырастим-ка дерево ....................................................................179 Классы типов, второй семестр .................................................... 183 «Внутренности» класса Eq ............................................................183 Тип для представления светофора ...............................................184 Наследование классов .................................................................186 Создание экземпляров классов для параметризованных типов ....187 Класс типов «да–нет» .................................................................. 190 Класс типов Functor ..................................................................... 193 Экземпляр класса Functor для типа Maybe ....................................195 Деревья тоже являются функторами .............................................196 И тип Either является функтором ...................................................197 Сорта и немного тип-фу .............................................................. 198 8. Ввод-вывод ........................................................204 Разделение «чистого» и «нечистого» ........................................... 204 Привет, мир! ............................................................................... 205 Объединение действий ввода-вывода ........................................ 207 Использование ключевого слова let внутри блока do ....................211 Обращение строк .........................................................................212 Некоторые полезные функции для ввода-вывода ........................ 215 Функция putStr..............................................................................215 Функция putChar ...........................................................................216 Функция print ................................................................................217 Функция when ...............................................................................218 Функция sequence ........................................................................218 Функция mapM .............................................................................220 Функция forever ............................................................................220 Функция forM ................................................................................221 Обзор системы ввода-вывода ..................................................... 222 9. Больше ввода и вывода ........................................223 Файлы и потоки ........................................................................... 223 Перенаправление ввода ...............................................................224 Получение строк из входного потока ............................................225 Преобразование входного потока.................................................228 Чтение и запись файлов .............................................................. 230 Использование функции withFile ...................................................233 Время заключать в скобки ............................................................234 Хватай дескрипторы! ....................................................................235 Список дел .................................................................................. 237 Удаление заданий ........................................................................238
ОГЛАВЛЕНИЕ Уборка ..........................................................................................240 Аргументы командной строки ...................................................... 241 Ещё больше шалостей со списком дел ........................................ 243 Многозадачный список задач .......................................................244 Работаем с некорректным вводом ................................................248 Случайность ................................................................................ 249 Подбрасывание монет ..................................................................252 Ещё немного функций, работающих со случайностью ..................254 Случайность и ввод-вывод............................................................255 Bytestring: тот же String, но быстрее ............................................ 259 Строгие и ленивые .......................................................................261 Копирование файлов при помощи Bytestring ................................263 Исключения ................................................................................. 265 Обработка исключений, возникших в чистом коде ........................267 Обработка исключений ввода-вывода ..........................................273 Вспомогательные функции для работы с исключениями ...............279 10. Решение задач в функциональном стиле ...............281 Вычисление выражений в обратной польской записи .................. 281 Вычисление выражений в ОПЗ .....................................................282 Реализация функции вычисления выражений в ОПЗ .....................283 Добавление новых операторов .....................................................286 Из аэропорта в центр .................................................................. 287 Вычисление кратчайшего пути ......................................................289 Представление пути на языке Haskell ............................................291 Реализация функции поиска оптимального пути ...........................293 Получение описания дорожной системы из внешнего источника ..296 11. Аппликативные функторы ...................................299 Функторы возвращаются ............................................................. 300 Действия ввода-вывода в качестве функторов .............................301 Функции в качестве функторов .....................................................304 Законы функторов ....................................................................... 308 Закон 1 .........................................................................................308 Закон 2 .........................................................................................309 Нарушение закона ........................................................................310 Использование аппликативных функторов .................................. 313 Поприветствуйте аппликативные функторы ..................................315 Аппликативный функтор Maybe ....................................................316 Аппликативный стиль ...................................................................318 Списки..........................................................................................320 Тип IO – тоже аппликативный функтор ..........................................323 Функции в качестве аппликативных функторов .............................325 Застёгиваемые списки .................................................................327 Аппликативные законы .................................................................329 Полезные функции для работы с аппликативными функторами ... 329
ОГЛАВЛЕНИЕ 10 12. Моноиды ..........................................................336 Оборачивание существующего типа в новый тип ......................... 336 Использование ключевого слова newtype для создания экземпляров классов типов ...............................................................................339 О ленивости newtype ....................................................................341 Ключевое слово type против newtype и data ..................................344 В общих чертах о моноидах ......................................................... 346 Класс типов Monoid ......................................................................348 Законы моноидов .........................................................................349 Познакомьтесь с некоторыми моноидами ................................... 350 Списки являются моноидами ........................................................350 Типы Product и Sum ......................................................................352 Типы Any и All ................................................................................354 Моноид Ordering ...........................................................................355 Моноид Maybe ..............................................................................359 Свёртка на моноидах ................................................................... 361 13. Пригоршня монад ..............................................367 Совершенствуем наши аппликативные функторы ....................... 367 Приступаем к типу Maybe ............................................................ 369 Класс типов Monad ...................................................................... 373 Прогулка по канату ...................................................................... 376 Код, код, код .................................................................................377 Я улечу .........................................................................................379 Банан на канате ............................................................................382 Нотация do .................................................................................. 385 Делай как я ...................................................................................387 Пьер возвращается ......................................................................388 Сопоставление с образцом и неудача в вычислениях ...................390 Списковая монада ....................................................................... 392 Нотация do и генераторы списков ................................................396 Класс MonadPlus и функция guard ................................................396 Ход конём .....................................................................................399 Законы монад ............................................................................. 402 Левая единица ..............................................................................402 Правая единица ............................................................................404 Ассоциативность ..........................................................................405 14. Ещё немного монад ...........................................408 Writer? Я о ней почти не знаю! ..................................................... 409 Моноиды приходят на помощь ......................................................412 Тип Writer ......................................................................................414 Использование нотации do с типом Writer ....................................416 Добавление в программы функции журналирования ....................417 Добавление журналирования в программы ..................................418