Монада - просто моноид в категории эндофункторов.
Вы только что растерялись, верно? Не переживайте, я был таким же растерянным, когда увидел это впервые! Все эти термины имеют какое-то значение только для тех, кто уже знаком с Функциональным Программированием™ (ФП), и являются просто набором звуков для всех остальных.
Эта книга не ставит своей целью научить читателя значению этих слов. Если это то, что вы хотите узнать - лучше попробовать поискать в другом месте. На самом деле, уже написано множество прекрасных книг, обучающих функциональному программированию в "правильном стиле". И конечно, эти термины исполнены смысла, так что, если вы занимаетесь глубоким формальным изучением функционального программирования, вы абсолютно обязаны разобраться в их значении.
Но эта книга подходит к вопросу с другой стороны. Я собираюсь представить вам фундаментальные концепции ФП, подходя к ним с практической стороны, используя минимум специализированной и неинтуитивной терминологии. Термины тоже будут, не переживайте. Но мы будет подходить к ним последовательно и осторожно, сопровождая их введение подробным обсуждением и разъяснением важности.
К сожалению, я не являюсь членом закрытого клуба экспертов в ФП. Я никогда не занимался формальным изучением функционального программирования. И хотя я имею образование в области Computer Science и довольно неплохо разбираюсь в математике, математические выражения - это не то, как мой мозг понимает программирование. Я до сих пор не написал ни строчки кода на Scheme, Clojure, или Haskell. И конечно, я не олдскульный Лиспер.
Но что я действительно сделал - так это посетил неисчислимое количество докладов о ФП на разнообразных конференциях, и на каждый из них я шел с надеждой, что вот уж теперь-то я наконец разберусь, в чем заключается мистицизм функционального программирования. И каждый раз я выходил разочарованным с неизменным ощущением того, что вся эта терминология перемешалась в моей голове в одну сплошную кашу. И я по-прежнему не имел представления, что же все это означает. Возможно, я и узнавал там новые вещи. Но ещё долгое время я не мог осознать их практическую пользу.
Однако, мало-помалу кусочки пазла в моей голове начнали собираться в единую картину важных базовых концепций, которые выглядят такими естественными для любого настоящего функциональщика. Я познавал их медленно, через призму практики и экспериментов, а не формально и с использованием подобающей терминологии. Случалось ли вам столкнуться с тем, что то, чем вы давно и успешно пользуетесь оказывается имеет своё собственное название, о котором вы никогда не знали!?
Если да, то, возможно, в этом вы похожи на меня; Я слышал слова вроде "map-reduce" в различных контекстах, особенно в отношении "больших данных" на протяжении лет, не имея ни малейшего представления о том, что они действительно означают. Со временем я узнал, что делает функция map(..)
-- до того момента я и представить себе не мог, что операции над массивами являются краеугольным камнем на пути функциональщика, и это делает их невероятно важными. Фактически, я знал, что делает map задолго до того, как узнал о его правильном названии.
Со временем, я начал собирать все эти фрагменты знаний в то, что позже назвал "Функционально-легким программированием" (ФЛП).
Почему же знания о функциональном программировании так важны для среднего программиста, даже в подобной легкой форме?
В последние годы, я пришел к убеждению, в которое поверил очень глубоко. Настолько глубоко, что оно стало для меня сродни религии. Я убежден, что программирование - это в отражение человека в целом, а не про набор знаков и символов, которые мы привыкли называть кодом. Код - в первую очередь форма коммуникации, а программа, и её работа внутри компьютера - лишь сайдэффект (саркастический смешок).
На мой взгляд, основа фунцкионального программирования - использование паттернов, которые общеизвестны, понятны и доказанно свободны от ошибок, делающих код сложнее для понимания. В этом смысле, ФП -- или, хм, ФЛП! -- является одним из наиболее важных и полезных наборов инструментов, которым разработчик может научиться пользоваться.
Проклятье монады в том... что однажда поняв... ты теряешь способность объяснить кому-либо ещё.
Дуглас Крокфорд 2012 "Монады и Гонады"
Я надеюсь, что эта книга, "Возможно" разобьет это проклятье, несмотря на то что мы не будем упоминать о монадах почти до самого конца книги.
Настоящие функциональщики обычно утверждают, что настоящая ценность, не может быть достигнута, если вы не пишете на 100% функциональный код. Считается, что если вы используете ФП только в одной части программы, и не используете в другой - то вся ваша программа загрязнена сайдэффектами настолько, что вероятно не стоило и заморачиваться с ФП стилем вообще.
Скажу однозначно: Я думаю что подобные абсолютистские заявления - полная чушь. Для меня это так же глупо, как говорить о том, что книга хороша только тогда, когда я использую совершенную грамматику и ритм повсюду; и если я где-то сделаю ошибку, это испортит всю книгу целиком. Ерунда.
Конечно, чем лучше качество написания кода и его конститентность, тем проще его будет прочитать. Но проблема в том, что я - не идеальный автор. И некоторые части удаются мне лучше, чем другие. Но те части, которые требуют улучшения вовсе не обесценивают пользу от всей книги.
То же справедливо и для кода. Чем больше и чаще вы будете применять данные принципе, тем лучше будет ваш код. Даже используя их только 25% времени вы получите ощутимую выгоду. Используйте их 80% времени, вы увидите что выгода выросла в разы.
За, возможно, некоторыми исключениями, в этой книге вы не найдете утверждений, претендующих на асолютную истину. Вместо этого, мы поговорим о целях и принципах, к которым нужно стремиться. Мы поговорим о балансе, прагматизме и компромиссах.
Добро пожаловать в это путешествие в самые полезные и практические основы ФП. Нам обоим есть чему поучиться!