Will Kurt, Get Programming with Haskell, 2017
Выход первой книги по Haskell от издательства Manning намечен на сентябрь 2017 года. У неё тяжёлая судьба: сначала автор не мог нащупать свой стиль, долго экспериментировал, за что рецензенты и редактор его сильно били, потом сменился редактор и это на долгое время приостановило работу над книгой. К счастью, сейчас, кажется, практически всё готово. Я принимал участие в работе, исполнял обязанности technical proofer’а, то есть проверял, что все объяснения соответствуют действительности, а примеры реально работают. Вся эта работа была проделана ещё в феврале, но мне, кстати, Manning до сих пор должны, обещают заплатить в ближайшее время.
Автор явно имеет лисперский бэкграунд (он везде лепит лишние скобки, я с этим пытался бороться, но не всегда успешно), занимается data science, ведёт блог и немного преподаёт, вроде бы даже Haskell.
Книга позиционируется как введение в Haskell для тех, кто уже имеет опыт программирования на императивных языках, но, возможно, ничего не знает о функциональном программировании. Она состоит из 42 уроков (нумеруемых с 0, что немного странно для книги по высокоуровневому языку), разбитых на 7 модулей. После установочного нулевого урока начинается первый модуль, посвящённый основам функционального программирования (к нему у меня больше всего претензий, об этом ниже), за которым следуют остальные шесть: введение в типы, программирование с типами, ввод-вывод, типы в контекстах, организация кода и сборка проектов, практическое программирование. Каждый модуль содержит от 4 до 9 уроков, последний урок посвящён закреплению изученного в модуле материала, это обычно разбор цельного проекта с большими возможностями для доработки читателем. Сами уроки обычно небольшие (в редком уроке набирается десяток страниц) и мелкозернистые, страница или полторы на один пункт. Это, кстати, политика Manning, редакторы жёстко за этим следят. Я люблю Manning.
Так вот, в первом модуле есть два очень странных урока. В одном из них масса времени тратится на понятие замыкания, которое потом становится (сюрприз!) ненужным благодаря сопоставлению с образцами и частичному применению. Спрашивается, зачем? Ну понятно, лиспер вылезает. Второй странный урок про рекурсию: приводится какой-то жуткий набор правил написания рекурсивных функций. В этом месте мне сразу вспоминается мультфильм, в котором сороконожку ходить учили, там от неё тоже требовали соблюдения правил. Наверное, это у автора какая-то травма детства. Итоговый проект в первом модуле тоже выдаёт старого лиспера: там пишутся объекты на основе замыканий, ну и моделируется вызов методов. Ладно, мне не жалко. Но в целом продвижение достаточно быстрое, объяснения простые и понятные.
Практически всё последующее мне нравится. Очень хороши два модуля про типы и финальные проекты в них (класс типов для шифрования, временные ряды — тут и Maybe, и Map’ы, и моноиды с полугруппами, всё очень к месту). Четвёртый модуль, посвящённый вводу-выводу, замечательный, с учётом ленивости и строгости, с типами Text и Bytestring, всё как у больших, в примерах среди прочего идёт работа с jpeg-ами, в них вносят искажения. В финальном проекте разбирают формат библиотечных записей MARC. Пятый модуль про функторы, аппликативы и монады, написано нормально. В этом вопросе всегда есть, к чему придраться, но в целом терпимо. В конце модуля реализуют что-то вроде DSL в виде SQL в коде на Haskell, интересно, называется HINQ. В шестом модуле рассказывают, как структурировать проекты, как использовать stack и QuickCheck, и пишут свою библиотеку. Седьмой, модуль, Practical Haskell, действительно практический: здесь показывают, как учитывать возможность ошибок с Either, делают HTTP-запросы, работают с JSON (Aeson!), подключаются к базам данных (SQLite), а также показывают массивы! Настоящие! С константным обновлением! С сортировкой методом пузырька! Обожаю. Финального проекта в последнем модуле нет, поскольку там и так в каждом уроке по проекту.
Знаете, что тут хорошо? У автора нет излишнего академизма (“мы учим высокому, добро пожаловать в башню из слоновой кости”) и его не интересует история вопроса (“сейчас все делают так и норм”). В этом смысле даже хорошо, что у него нет тридцатилетнего опыта знакомства с Haskell. Практик, одним словом, и получилось у него RWH, но для начинающих. Мне такое сочетание нравится, такой книги у нас ещё не было.
В общем, рекомендую всё, кроме первого модуля. Хотя чёрт с ним, его тоже можно читать.