Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Изучай Haskell во имя добра!

Покупка
Артикул: 816359.01.99
Доступ онлайн
439 ₽
В корзину
На взгляд автора, сущность программирования заключается в решении проблем. Программист всегда думает о проблеме и возможных решениях — либо пишет код для выражения этих решений. Язык Haskell имеет множество впечатляющих возможностей, но главное его свойство в том, что меняется не только способ написания кода, но и сам способ размышления о проблемах и возможных решениях. Этим Haskell действительно отличается от большинства языков программирования. С его помощью мир можно представить и описать нестандартным образом. И поскольку Haskell предлагает совершенно новые способы размышления о проблемах, изучение этого языка может изменить и стиль программирования на всех прочих. Еще одно необычное свойство Haskell состоит в том, что в этом языке придается особое значение рассуждениям о типах данных. Как следствие, вы помещаете больше внимания и меньше кода в ваши программы. Вне зависимости от того, в каком направлении вы намерены двигаться, путешествуя в мире программирования, небольшой заход в страну Haskell себя оправдает. А если вы решите там остаться, то наверняка найдете чем заняться и чему поучиться! Эта книга поможет многим читателям найти свой путь к Haskell.
Липовача, М. Изучай Haskell во имя добра! : практическое руководство / М. Липовача ; пер. с англ. Д. Леушина, А. Синицына, Я. Арсанукаева. - 2-е изд. - Москва : ДМК Пресс, 2023. - 492 с. - ISBN 978-5-89818-338-7. - Текст : электронный. - URL: https://znanium.com/catalog/product/2102625 (дата обращения: 04.07.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Миран Липовача

Изучай 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

ОГЛАВЛЕНИЕ

Неэффективное создание списков ...............................................420
Разностные списки .......................................................................422
Сравнение производительности ...................................................424
Монада Reader?Тьфу, опять эти шуточки! .................................... 425
Функции в качестве монад ............................................................426
Монада Reader .............................................................................427
Вкусные вычисления с состоянием ............................................. 429
Вычисления с состоянием ............................................................430
Стеки и чебуреки ..........................................................................431
Монада State ................................................................................433
Получение и установка состояния .................................................437
Случайность и монада State ..........................................................438
Свет мой, Error, скажи, да всю правду доложи ............................. 439
Некоторые полезные монадические функции .............................. 442
liftM и компания ............................................................................442
Функция join .................................................................................446
Функция filterM .............................................................................449
Функция foldM ..............................................................................452
Создание безопасного калькулятора выражений в обратной 
польской записи.......................................................................... 454
Композиция монадических функций ............................................ 457
Создание монад .......................................................................... 459

15. Застёжки .........................................................467
Прогулка ..................................................................................... 468
Тропинка из хлебных крошек ........................................................471
Движемся обратно вверх ..............................................................473
Манипулируем деревьями в фокусе .............................................476
Идем прямо на вершину, где воздух чист и свеж! ..........................478
Фокусируемся на списках ........................................................... 478
Очень простая файловая система ............................................... 480
Создаём застёжку для нашей файловой системы .........................482
Манипулируем файловой системой ..............................................485
Осторожнее – смотрите под ноги! ............................................... 486
Благодарю за то, что прочитали! ................................................. 489

От издателя

Эта книга начиналась как англоязычный онлайновый учебник по 
языку Haskell, написанный словенским студентом, изучающим информатику, Мираном Липовачей (Miran Lipovača) в 2008 году. В мае 
2009 года на сайте translated.by пользователь Дмитрий Леушин 
предложил первые главы учебника для перевода на русский язык. 
Его инициативу подхватил Александр Синицын. В переводе также 
принимали участие Виталий Капустян, Иван Терёхин, Дмитрий 
Крылов, пользователи olegchir, artobstrel95, Julia и другие. Оригинальный учебник оказался настолько популярным, что в 2011 году 
он был издан в печатном виде. Текст онлайнового издания при 
подготовке печатного издания был серьёзно исправлен и улучшен. 
Последние пять глав учебника переводились уже по печатному изданию Ясиром Арсанукаевым. Готовый текст был отредактирован 
Романом Душкиным. На втором этапе редактированием занимался 
Виталий Брагилевский; он также привёл текст первых десяти глав 
книги в соответствие с англоязычным печатным изданием и переработал текст раздела «Исключения». Оформление, вёрстка и другие технические работы выполнялись сотрудниками издательства 
«ДМК Пресс».

Предисловие

Когда в начале 2006 года я садился за свою первую книгу по функциональному программированию [2], в которой намеревался проиллюстрировать все теоретические положения при помощи языка Haskell, у меня возникали некоторые сомнения на сей счёт. Да, 
за плечами уже был пятилетний опыт чтения потоковых лекций 
по функциональному программированию в Московском Инженерно-Физическом Институте (МИФИ), для которых я и ввёл в учебный процесс этот замечательный язык вместо использовавшегося 
прежде языка Lisp. Однако в качестве методической основы тогда 
ещё не было практически ничего, кроме формального описания 
языка и нескольких статей. Существовало, впрочем, несколько книг 
о Haskell на английском языке [3, 4, 5, 7], но в те времена достать 
их было несколько затруднительно. Тем не менее я выбрал именно 
этот язык, поскольку создавать очередной том о функциональном 
программировании на Lisp (на каком-либо из его многочисленных 
диалектов) было бы нецелесообразно – такие книги имелись в избытке.
Сегодня можно уверенно сказать, что тогда я не ошибся в своём 
выборе. Развитие языка шло темпами набирающего скорость локомотива. Появлялись компиляторы (в том числе и полноценная среда разработки Haskell Platform), разно образные утилиты 
для помощи в разработке, обширнейший набор библиотек, а главное – сложилось сообщество программистов! За несколько лет 
язык приобрел огромное количество почитателей, в том числе 
русско язычных. Притом возник так называемый эффект «петли 
положительной обратной связи»: стремительно растущее сообщество стало ещё активнее развивать язык и всё, что с ним связано. И вот уже количество библиотек для Haskell насчитывает 
не одну тысячу, охватывая всевозможные задачи, встречающиеся 
в повсе дневном процессе коммерческой разработки. Выходят но
ПРЕДИСЛОВИЕ
14

вые книги, одна из которых [6] буквально взрывает общественное 
мнение. Теперь Haskell уже не воспринимается в качестве языка 
«нёрдов», получая статус вполне респектабельного средства программирования. На русском языке начинают выходить многочисленные переводы статей по Haskell (в том числе и официальные), 
основывается первый журнал, посвящённый функциональному 
программированию – «Практика функционального программирования» (ISSN 2075-8456).
И вот сегодня вы, уважаемый читатель, держите в руках переводное издание новой интересной книги о языке Haskell и основах реального программирования на нём. Эта публикация опять 
же стала возможной благодаря деятельности профессионального сообщества. Группа инициативных любителей языка Haskell 
перевела значительную часть текста, после чего издательством 
«ДМК Пресс», которое уже становится флагманом в деле издания 
книг о функциональном программировании в России, был проведён весь комплекс предпечатных работ – научное редактирование, корректура, вёрстка.
Миран Липовача – автор из Словении, который написал свою 
книгу «Изучай Haskell во имя добра», с тем чтобы сделать процесс освоения Haskell легким и весёлым. Оригинал книги, опубликованный 
в сети Интернет, написан в весьма вольном стиле – автор позволяет 
себе многочисленные жаргонизмы и простое (даже, можно сказать, 
простецкое) обращение с читателем. Текст дополнен многочисленными авторскими рисунками, предназначенными исключительно 
для развлечения читателя и не несущими особой смысловой нагрузки. Поначалу всё это заставляет предположить, что книга «несерьёзная», однако это впечатление обманчиво. Здесь представлено очень 
хорошее описание как базовых принципов программирования на 
Haskell, так и серьёзных идиом языка, пришедших из теории категорий (функторы, аппликативные функторы, монады). Притом автор 
пользуется очень прос тым языком и приводит доступные для понимания примеры. Вообще, книга насыщена разнообразными примерами, и это её положительная черта.
При работе над русским изданием коллектив переводчиков 
постарался сохранить своеобразный стиль автора, чтобы передать 
своеобразие оригинала. Однако в процессе научного редактирования некоторые моменты были сглажены, терминология приведена к единообразию и согласована с уже устоявшимися терминами 

ПРЕДИСЛОВИЕ

на русском языке. Тем не менее манера изложения материала далека 
от сухого академического стиля, который характерен для многих 
публикаций о функциональном программировании.
Напоследок, впрочем, стоит отметить и некоторые недостатки. 
Автор сам признаётся, что написал свою книгу с целью структуризации и классификации собственных знаний о языке Haskell. Так что 
к ней надо относиться с определённой долей осторожнос ти, хотя 
в процессе научного редактирования не было обнаружено фактологических ошибок. Ещё один минус – полное отсутствие каких-либо 
сведений об инструментарии языка: читателю предлагается лишь 
скачать и установить Haskell Platform, а затем приступать к работе. Можно именно так и поступить, но вдумчивому читателю будет 
интересно узнать о способах использования инструментария. Этот 
пробел можно восполнить книгой [1].
В целом книгу Мирана Липовачи можно рекомендовать в качестве дополнительного источника информации о практическом 
использовании языка Haskell. Она будет полезна всем, кто интересуется функциональным программированием, равно как и студентам, обучающимся по специальностям, связанным с программированием и вычислительной техникой.

ДУШКИН Роман Викторович,
автор первых книг о языке Haskell на русском языке,
Москва, 2011 г.

Ссылки на источники
1. Душкин Р. В. Практика работы на языке Haskell. – М.: ДМК-Пресс, 2010. – 
288 стр., ил. – ISBN 978-5-94074-588-4.
2. Душкин Р. В. Функциональное программирование на языке Haskell. – 
М.: ДМК-Пресс, 2007. – 608 стр., ил. – ISBN 5-94074-335-8.
3. Davie A. J. T. Introduction to Functional Programming Systems Using Haskell. – 
Cambridge University Press, 1992. – 304 p. – ISBN 0-52127-724-8.
4. Doets K., Eijck J. v. The Haskell Road To Logic, Maths And Programming. – King’s 
College Publications, 2004. – 444 p. – ISBN 0-95430-069-6.
5. Hudak P. The Haskell School of Expression: Learning Functional Programming through Multimedia. – Cambridge University Press, 2000. – 382 p. – 
ISBN 0-52164-408-9.
6. O’Sullivan B., Goerzen J., Stewart D. Real World Haskell. – O’Reilly, 2008. – 
710 p. – ISBN 0-596-51498-0.
7. Thompson S. Haskell: The Craft of Functional Programming. – Addison Wesley, 
1999. – 512 p. – ISBN 0-20134-275-8.

Введение

Перед вами книга «Изучай Haskell во имя добра!» И раз уж вы взялись за её чтение, есть шанс, что вы хотите изучить язык Haskell. 
В таком случае вы на правильном пути – но прежде чем продолжить 
его, давайте поговорим о самом учебнике.
Я решился написать это руководство потому, что захотел упорядочить свои собственные знания о Haskell, а также потому, что 
надеюсь помочь другим людям в освоении этого языка. В сети Интернет уже предостаточно литературы по данной теме, и когда 
я сам проходил период ученичества, то использовал самые разные 
ресурсы.
Чтобы поподробнее ознакомиться с Haskell, я читал многочисленные справочники и статьи, в которых описывались различные 
аспекты при помощи различных методов. Затем я собрал воедино 
все эти разрозненные сведения и положил их в основу собственной 
книги. Так что этот учебник представляет собой попытку создать 
ещё один полезный ресурс для изучения языка Haskell – и есть вероятность, что вы найдёте здесь именно то, что вам нужно!
Эта книга рассчитана на людей, которые уже имеют опыт работы с императивными языками программирования (C++, Java, 
Python...), а теперь хотели бы попробовать Haskell. Впрочем, бьюсь 
об заклад, что даже если вы не обладаете солидным опытом программирования, с вашей природной смекалкой вы легко освоите 
Haskell, пользуясь этим учебником!
Моей первой реакцией на Haskell было ощущение, что язык 
какой-то уж слишком чудной. Но после преодоления начального барьера всё пошло как по маслу. Даже если на первый взгляд 
Haskell кажется вам странным, не сдавайтесь! Освоение этого 
языка похоже на изучение программирования «с нуля» – и это 
очень занимательно, потому что вы начинаете мыслить совершенно иначе...

ПРИМЕЧАНИЕ. IRC-канал #haskell на Freenode Network – отличный ресурс для тех, кто испытывает затруднения в обучении и хочет задать вопросы по какой-либо теме. Люди там чрезвычайно 
приятные, вежливые и с радостью помогают новичкам.

Так что же такое Haskell?

Язык Haskell – это чисто функциональный язык программирования. 
В императивных языках результат достигается при передаче компьютеру последовательности команд, которые он затем выполняет. 
При этом компьютер может изменять своё состояние. Например, 
мы устанавливаем переменную a равной 5, производим какое-либо 
действие, а затем меняем её значение... Кроме того, у нас есть управляющие инструкции, позволяющие повторять несколько раз 
определённые действия, такие как циклы for и while. В чисто функциональных языках вы не говорите компьютеру, как делать те или 
иные вещи, – скорее вы говорите, что представляет собой ваша 
проблема.
Факториал числа – это произведение целых чисел от 1 до данного числа; 
сумма списка чисел – это первое число плюс сумма всех остальных чисел, 
и так далее. Вы можете выразить обе 
эти операции в виде функций. В функциональной программе нельзя присвоить переменной сначала одно значение, а затем какое-то другое. Если 
вы решили, что a будет равняться 5, то 
потом уже не сможете просто передумать и заменить значение на что-либо 
ещё. В конце концов, вы же сами сказали, что a равно 5! Вы что, 
врун какой-нибудь? 
В чисто функциональных языках у функций отсутствуют побочные эффекты. Функция может сделать только одно: рассчитать чтонибудь и возвратить это как результат. Поначалу такое ограничение 
смущает, но в действительности оно имеет приятные последствия: 
если функция вызывается дважды с одними и теми же параметрами, это гарантирует, что оба раза вернётся одинаковый результат. 
Это свойство называется ссылочной прозрачностью. Оно позволяет 

ТАК ЧТО ЖЕ ТАКОЕ HASKELL?

Доступ онлайн
439 ₽
В корзину