Что такое функциональное программирование?
⚡ Умное резюме
Функциональное программирование — это способ создания программного обеспечения путем композиции чистых функций, избегая общего состояния и изменяемых данных. Оно делает упор на выражения, а не на операторы, поэтому результат работы функции зависит только от ее входных данных, что делает программы предсказуемыми и тестируемыми.

Что такое функциональное программирование?
Функциональное программирование (также называемое ФП) — это способ мышления о построении программного обеспечения путем создания чистых функций. Оно избегает концепций общего состояния и изменяемых данных, наблюдаемых в объектно-ориентированном программировании.
В функциональных языках программирования акцент делается на выражениях и объявлениях, а не на выполнении операторов. Поэтому, в отличие от других процедур, зависящих от локального или глобального состояния, выходное значение в функциональном программировании зависит только от аргументов, переданных функции.
Характеристики функционального программирования
- Метод функционального программирования фокусируется на результатах, а не на процессе.
- Основное внимание уделяется тому, что именно нужно вычислить.
- Данные неизменяемы.
- Функциональное программирование разбивает задачу на функции.
- Она основана на концепции математических функций, которые используют условные выражения и рекурсию для выполнения вычислений.
- Он не поддерживает итерацию, как циклы, и условные операторы, такие как If-Else.
История функционального программирования
- Основой функционального программирования является лямбда-исчисление. Оно было разработано в 1930-х годах для функционального применения, определения и рекурсии.
- LISP был первым функциональным языком программирования. Маккарти разработал его в 1960 году.
- В конце 70-х годов исследователи из Эдинбургского университета дали определение метаязыку (ML).
- В начале 80-х годов в язык Hope были добавлены алгебраические типы данных для рекурсии и рассуждений на основе уравнений.
- В 2004 году был разработан функциональный язык программирования «Scala».
Функциональные языки программирования
Цель любого функционального языка программирования — имитировать математические функции. Однако основной процесс вычислений в функциональном программировании отличается.
Вот некоторые из наиболее известных функциональных языков программирования:
- Haskell
- SML
- Clojure
- масштаб
- Erlang
- Чистка
- F#
- ML/OCaml Lisp/Схема
- XSLT
- SQL
- Mathematica
Базовая терминология функционального программирования и Concepts
Неизменяемые данные
Неизменяемые данные означают, что вы должны иметь возможность легко создавать структуры данных, а не изменять уже существующие.
Ссылочная прозрачность
Функциональные программы должны выполнять операции так, как если бы это было впервые. Таким образом, вы будете знать, что могло произойти или не произойти во время выполнения программы, и каковы были побочные эффекты. В терминах функционального программирования это называется референциальной прозрачностью.
модульность
Модульная конструкция повышает производительность. Небольшие модули можно быстро написать и они имеют больше шансов на повторное использование, что, безусловно, приводит к ускорению разработки программ. Кроме того, модули можно тестировать отдельно, что помогает сократить время, затрачиваемое на модульное тестирование и отладку.
Ремонтопригодность
Поддерживаемость — это простой термин, означающий, что программирование с функциональным программированием проще в сопровождении, поскольку вам не нужно беспокоиться о случайном изменении чего-либо за пределами данной функции.
Первоклассная функция
«Функция первого класса» — это определение, применяемое к сущностям языка программирования, использование которых не ограничено. Следовательно, функции первого класса могут появляться в любом месте программы.
Закрытие
Замыкание — это внутренняя функция, которая может получать доступ к переменным родительской функции даже после выполнения родительской функции.
Функции высшего порядка
Функции высшего порядка либо принимают другие функции в качестве аргументов, либо возвращают их как результаты.
Функции высшего порядка позволяют использовать частичное применение или каррирование. Этот метод применяет функцию к ее аргументам по одному, причем каждое применение возвращает новую функцию, которая принимает следующий аргумент.
Чистая функция
«Чистая функция» — это функция, входные данные которой объявлены как входные, и ни один из них не должен быть скрыт. Выходы также объявляются как выходы.
Чистые функции работают со своими параметрами. Они неэффективны, если ничего не возвращают. Более того, они выдают одинаковый результат для заданных параметров.
Это критически важно для анализа и выбора наиболее эффективных ключевых слов для улучшения рейтинга вашего сайта.
Function Pure(a,b) { return a+b; }
Нечистые функции
Нечистые функции — это полная противоположность чистым функциям. У них есть скрытые входные или выходные данные, поэтому они и называются нечистыми. Нечистые функции нельзя использовать или тестировать изолированно, поскольку они имеют зависимости.
Пример
int z; function notPure(){ z = z+10; }
Состав функций
Композиция функций — это объединение двух или более функций в одну.
Общие состояния
Разделяемое состояние — важная концепция в объектно-ориентированном программировании. По сути, это добавление свойств к объектам. Например, если HardDisk — это объект, то в качестве свойств можно добавить Storage Capacity и Disk Size.
Побочные эффекты
Побочные эффекты — это любые изменения состояния, происходящие вне вызываемой функции. Главная цель любого функционального языка программирования — минимизировать побочные эффекты, отделяя их от остального программного кода. В функциональном программировании крайне важно изолировать побочные эффекты от остальной логики программирования.
Преимущества функционального программирования
- Позволяет избежать путаницы и ошибок в коде.
- Упрощено тестирование и выполнение модульного тестирования, а также отладка функционального программирования. Code.
- Параллельная обработка и многопоточность.
- Горячее развертывание кода и отказоустойчивость.
- Обеспечивает лучшую модульность и более короткий код.
- Повышение производительности разработчика.
- Поддерживает вложенные функции.
- Функциональные конструкции, такие как ленивые карты и списки и т. д.
- Позволяет эффективно использовать лямбда-исчисление.
Ограничения функционального программирования
- Парадигма функционального программирования непроста, поэтому новичкам её сложно понять.
- Поддерживать такой подход сложно, поскольку многие объекты изменяются в процессе кодирования.
- Требуется много имитаций объектов и обширная настройка окружения.
- Повторное использование — очень сложный процесс, требующий постоянной рефакторизации.
- Объекты могут некорректно отражать проблему.
Функциональное программирование против объектно-ориентированного программирования
| Функциональное программирование | ООП |
|---|---|
| FP использует неизменяемые данные. | ООП использует изменяемые данные. |
| Используется модель, основанная на декларативном программировании. | Используется императивная модель программирования. |
| Основное внимание уделяется тому, «чем вы занимаетесь в рамках программы». | Основное внимание уделяется тому, «как вы занимаетесь программированием». |
| Поддерживает параллельное программирование. | Поддержка параллельного программирования отсутствует. |
| Его действие не вызывает побочных эффектов. | Один и тот же метод может вызывать множество побочных эффектов. |
| Управление потоком осуществляется с помощью вызовов функций и вызовов функций с рекурсией. | Процесс управления потоком осуществляется с использованием циклов и условных операторов. |
| Порядок выполнения операторов не очень важен. | Порядок выполнения операторов важен. |
| Поддерживает оба варианта "Abs".trac«в отношении данных» и «Абстрактные»trac«Влияние на поведение». | Поддерживает только «Abs»trac«Передача данных». |

