Graham Hutton, Programming in Haskell, 2nd ed, 2016

Примерно год назад издательство Cambridge University Press любезно предоставило мне второе издание учебника Грэхема Хаттона «Programming in Haskell». Сейчас я, готовясь к новому семестру, его прочитал.

Это действительно учебник для начинающих, я бы характеризовал его как пособие для студентов младших курсов, которые ещё не задаются вопросом о том, сколько им начнут платить за применение полученных в результате изучения знаний. Потому что применить эти знания сразу совершенно точно не удастся: ни одну более или менее реальную программу написать не получится. Впрочем, такая задача автором явно не ставится, многие в академии считают её чем-то постыдным, поэтому от известного профессора ждать чего-то такого и не стоит.

Год назад я не обратил на эту книгу серьёзное внимание, поскольку тогда читал курс Хаскеля четверокурсникам, а они уже слишком большие, чтобы с ними это проходило. Сейчас же я в процессе перевода курса с четвёртого года обучения на второй и двукратного сокращения, и тут вдруг выяснилось, что книжка очень хорошая.

Первое издание вышло в 2007 году и было ужасным, во втором же автору удалось исправить все методические и смысловые ошибки, многое было обновлено и гораздо логичнее представлено. В книге 304 страницы и 17 глав, разбитых на две части: «Основные концепции» и «Двигаясь дальше» — разбиение очень точное, особенно в моей ситуации 8-недельного курса.

В первых двух главах автор вводит читателя в основные идеи и составляющие функционального стиля программирования и языка Haskell, а также даёт первые примеры кода (для исполнения в интерпретаторе GHCi — там же он, кстати, остаётся до конца). Третья глава называется «Типы и классы», в ней довольно много всего: от базовых типов к спискам и кортежам, функциональные типы и идея каррирования, полиморфизм и перегрузка, идея и простые примеры классов типов. Всё это укладывается в 15 страниц текста, на которых проявляется фирменный стиль автора: объяснения очень чёткие, короткие, но вполне достаточные для последующего. Хаттон умеет себя ограничивать, но всегда аккуратно расставляет ссылки для желающих продолжить изучение вопроса.

Следующие пять глав, с четвёртой по восьмую, составляют основное содержание первой части и отражают представления автора о базовом Хаскеле, представления немного спорные, но заслуживающие уважения. Итак, это: способы определения функций (глава 4), списковая нотация (list comprehensions, глава 5), рекурсивное определение функций (глава 6), функции высшего порядка (глава 7) и, наконец, определение собственных типов и классов типов (глава 8). Ещё одна составляющая фирменного стиля: демонстрация вводимых понятий на красивых примерах, «функциональных жемчужинах», сначала простых, а потом всё более заковыристых. Тут и шифр Цезаря (со взломом на основе анализа частот!), и кодирование строк для передачи по каналу (не помехоустойчивое!), и система голосования, наконец, проверка тавтологий и абстрактная машина для вычисления значения арифметических выражений. В общем, чудесные академические задачки, хотя и совершенно бесполезные в жизни. Впрочем, в этих задачах есть о чём подумать (к ним прилагается много хороших упражнений, в том числе и довольно сложных), подобраны они удачно, и иллюстрируют всё, что требуется.

Первая часть завершается девятой главой с расширенным примером — countdown problem — любимой функциональщиками задачей построения арифметических выражений по заданному набору числовых констант и требуемому значению. Интересно, но непонятно, как такое использовать в лекционном курсе. Боюсь, что никак, это можно только читать, задумываясь над каждой строчкой.

Вторая часть немногим длиннее первой (140 страниц против 120-ти). Тут у нас простейший ввод-вывод (Виселица, Ним, Жизнь — классика!), крестики–нолики (с поиском выигрышной стратегии по методу минимакса), функторы–аппликативы–монады (всего 26 страниц на всё — идеальный размер, ничего лишнего и, разумеется, без глупых шуток), монадический разбор текста (парсер-комбинаторы), моноиды–Foldable–Traversable, ленивые вычисления. Собственно Haskell на этом заканчивается, последние две главы посвящены формальным рассуждениям и преобразованию функциональных программ и «вычислению компиляторов» по свежей статье автора (2015 года).

В приложениях решения избранных упражнений и сводка функций стандартной библиотеки (кому это вообще сейчас нужно?).

Восторженное предисловие к книге написал Эрик Мейер (ну тот, которому сильно не нравится развитие GHC и который грозился перейти в своём курсе функционального программирования на Hugs), больше всего ему понравились последние главы, «близкие по тематике к его диссертации».

Итак: содержание книги очень базовое, без излишеств, но достаточно актуальное (к середине книги автор честно признаётся, что про функции на списках поначалу врал); примеры красивые и интересные, но не слишком (совсем не) практичные; упражнения полезные; список литературы объёмный и тоже полезный (есть ссылка на книжку Awodey по теории категорий!). Книга рекомендуется для использования при начальном обучении функциональному программированию и языку Haskell (в том числе и самостоятельно), пройти всё можно месяца за два–три.

P.S. Прошу прощения за Мейера, он, разумеется, очень хорош, но в том эпохальном споре не совсем прав.