Кстати, на изображениях внутри вы найдёте QR-коды с дополнительной информацией по теме.
Функциональное программирование — это не просто какие-то приколы вокруг чистых функций, монад или иммутабельности. Важно иметь четкое понимание: как пользоваться этим инструментом, в каких случаях его применять, какова его история, откуда он происходит, к чему ведет и почему стал таким, какой есть.
Например, хотите понять, что такое монада?
Теперь закрепим сказанное. Теория категорий в программировании — отличный фундамент, помогающий избежать изобретения велосипедов. Чаще всего мы создаём их просто потому, что не понимаем основу. Это нормальный процесс обучения. В повседневной работе используйте это как спецификацию. У вас есть схема: хотите реализовать концепцию или функтор — определите, что для этого нужно.
Можно изучать множество сложных концепций о том, что это единственный способ задания императивной последовательности в ФП. Но давайте проще, для запоминания: монада — это цепочка обязанностей, но на уровне типов и функции, или прям чтоб еще проще запомнить, но, упарываясь в философию, монада — это способ применить одно замыкание к другому (с методами bind для связывания и return для закидывания значений в функтор, что позволяет переводить вывод одной функции в другую).
Так мы приходим к теории автоматов — ещё одному разделу математики.
И тут вы чувствуете что-то возвышенное — это нормально.
Были цифры от персидского математика Аль-Хорезми. Эти цифры сами по себе ничего не хранят — мы просто пишем их на бумаге, они выполняют декларативную функцию. Потом появился Аристотель с его силлогизмами, где «Сократ должен умереть». Эту историю многие слышали на курсе логики в университете. Затем появилась алгебра логики, которую разрабатывали более полутора тысяч лет — то, что мы называем сейчас булевой алгеброй. Она тоже ничего не хранит, это декларативный стиль. Потом Морзе создаёт телеграф, позволяющий передавать электрические сигналы по проводам. А затем происходит нечто удивительное: Тьюринг создаёт первый компьютер с хранимой в памяти и исполняемой программой.
Если упростить их работу, они пытались доказать, что бесконечные задачи, скорее всего, не решаются механическим путём, а конечные — решаются. Существуют разные формулировки этих тезисов: есть сложный тезис Чёрча-Тьюринга, есть упрощённый, который сформулировали другие, есть понятие полноты по Тьюрингу.
Теперь о логике. Как построить логические операции, когда у вас есть только функции? Как получить true и false? Решение элегантное: создаём функтор с двумя аргументами, x и y. Для true возвращаем x, для false — y. Так мы вычисляем значения на лету.
По ссылке множество примеров перформанса этого решения.
А как бы выглядел EDD с обработкой событий, теоркатом и lambda calculus?
ФП помогает упростить процессы. Например, AWS Lambda взяли простую идею: каждая функция — это отдельный Node.js процесс. Такой подход позволяет решать задачи, следуя теории минимальных частей.
Интересный подход предложил Дэн Абрамов на конференции We Are Developers. В его выступлении читалась мысль, что, вероятно, мы прошли круг в 30 лет и, создав server components, снова сделали PHP. Не знаю, закладывал ли он эту идею и писал ли об этом кто-то, но покопавшись в sandbox я понял одно: серверные компоненты позволяют обмениваться функциями.
Здесь собрана огромная портянка разных JS методов. Можете их почитать, больше залезть в историю, практические примеры, что-то копипастить.
Итак, вы должны задать себе финальный вопрос. А что такое ФП?