Что такое функциональное программирование
Функциональное программирование — один из стилей кодинга, где есть функции в их математическом понимании и неизменяемые блоки данных. Код в ней описывают в виде правил работы с данными, которые могут исполняться в любой последовательности.
Функция возвращает выходные данные при наличии вводных. Разработчик здесь не задаёт жёсткую последовательность требуемых команд, а даёт описание принципа их взаимодействия с подпрограммами. При использовании достигается чистота кода, а разобраться в нём гораздо проще. Это позволяет задействовать меньшее количество ресурсов в разработке.
Чем различаются функциональный и императивный подходы
Это можно показать на примере работы автосервиса. В сервисе у механика есть пошаговая инструкция по обслуживанию машины, чётко прописанный регламент действий. А у администратора есть только общие правила работы: то, как он выполнит эти команды, остаётся на его усмотрение.
Где используют функциональное программирование
Его используют реже, чем императивный и объектно ориентированный подходы. Но популярность парадигмы растёт, языки функционального программирования получили широкое распространение:
— К функциональному методу часто обращаются там, где применение императивных языков становится слишком ресурсоёмким. Например, при создании искусственного интеллекта, включая нейросети.
— Часто функциональный стиль используют при решении конкретных задач в рамках фреймворка. Так, в Data Science и работе с «большими данными» он необходим для быстрой обработки огромного массива данных, а императивный подход применяют для работы над интерфейсом.
— Ещё к функциональной парадигме прибегают, когда нужно оптимизировать высоконагруженные системы. Например, язык Erlang активно используют в разработке масштабных облачных систем.
Преимущества функционального программирования
Надёжность. Код отличается высокой надёжностью: в нём используются чистые функции, которые не изменяют программное окружение. Баг в конкретной функции не повлечёт проблем с другими компонентами. А ещё такой код удобно тестировать. В какой бы момент тестировщик ни запустил функцию, он всегда получит предсказуемый результат.
Многопоточность. Такая программа сразу готова к работе в многопоточности. Этот эффект достигается благодаря фундаментальным особенностям подхода, где нет жёсткой последовательности исполнения кода. Разработчик может добавлять потоки в софт, не задумываясь о побочных эффектах. Правда, для эффективного раскрытия многопоточности потребуется больше памяти, чем при императивном подходе.
Оптимизация. Код, написанный на языках функционального программирования, проще оптимизировать, ведь компилятор сам решает, в какой последовательности вызываются функции. Код можно автоматически оптимизировать на уровне ассемблера.
Наконец, в такой программе можно анализировать код локально, не отвлекаясь на общий контекст исполнения кода.
Принципы функционального программирования
Чистые функции. Такое возможно при соблюдении двух условий:
— Функция всегда возвращает одинаковое значение при одинаковых входах.
— При её выполнении не возникает побочных эффектов, которые могут повлиять на окружение.
Неизменность. Функциональное программирование не имеет переменных. Фактически они являются константами. Если нужно провести вычисления с переменной, создают новую, результаты в неё же и записывают.
Нет жёсткой последовательности. Программист лишь задаёт правила, компилятор сам решает, в какой последовательности выполнять их.
Рекурсия. В функциональном программировании используют принцип рекурсии — функции могут вызывать сами себя.
Прозрачность. Функция всегда даёт одинаковый результат, если ей предоставляют те же аргументы. Она работает исключительно с заданными значениями и не ссылается на глобальное состояние.
Лямбда-исчисление. Математическая система, в которой все функции могут быть анонимными и складываются из списка аргументов. При вызове функция проходит через каррирование — преобразование в несколько действий, в каждом из которых содержится один аргумент.
Языки функционального программирования
Существуют отдельные языки, в основе которых исключительно функциональный подход. Среди них:
— Haskell. Распространённый язык, отличающийся строгой и статической типизацией с автоматическим выводом типов. Есть встроенная поддержка многозадачного и параллельного программирования.
— Clojure. Относится к семейству Lisp. Язык поддерживает интерактивную разработку и многопоточное программирование. Способен работать на виртуальной машине Java.
— Erlang. Язык для параллельных вычислительных систем. Отличается высокой отказоустойчивостью. Часто используется разработчиками мессенджеров.
— F#. Универсальный язык, где упор сделан именно на функциональное программирование.
Существуют языки, в которых присутствуют элементы функций. Например, Scala или JavaScript. В последнем много функций парадигмы, среди которых лямбда-исчисления. Именно это сделало JavaScript популярным решением для функционального программирования.