Изучай 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
ОГЛАВЛЕНИЕ Неэффективное создание списков ...............................................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?
Доступ онлайн
В корзину