Парадигма функционального программирования

Опубликовано: 13 Июля, 2021

Вступление
Функциональное программирование - это парадигма программирования, в которой мы пытаемся связать все в стиле чисто математических функций. Это декларативный тип стиля программирования. Его основной упор делается на «что решать» в отличие от императивного стиля, где основной упор делается на «как решать». Вместо операторов используются выражения. Выражение вычисляется для получения значения, тогда как оператор выполняется для присвоения переменных. У этих функций есть некоторые особенности, обсуждаемые ниже.

Функциональное программирование основано на лямбда-исчислении:
Лямбда-исчисление - это фреймворк, разработанный Алонзо Черчем для изучения вычислений с функциями. Его можно назвать самым маленьким языком программирования в мире. Он дает определение того, что вычислимо. Все, что можно вычислить с помощью лямбда-исчисления, вычислимо. По способности вычислений он эквивалентен машине Тьюринга. Он обеспечивает теоретическую основу для описания функций и их оценки. Он составляет основу практически всех современных языков функционального программирования.
Факт: Алан Тьюринг был учеником Алонзо Черча, который создал машину Тьюринга, заложившую основу императивного стиля программирования.

Языки программирования, поддерживающие функциональное программирование: Haskell, JavaScript, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.

Понятия функционального программирования:

  • Чистые функции
  • Рекурсия
  • Ссылочная прозрачность
  • Функции являются первоклассными и могут быть более высокого порядка
  • Переменные неизменяемы

Чистые функции: у этих функций есть два основных свойства. Во-первых, они всегда производят одинаковый результат для одних и тех же аргументов независимо от чего-либо еще.
Во-вторых, у них нет побочных эффектов, т.е. они модифицируют любой аргумент или глобальные переменные или что-то выводят.
Позднее свойство называется неизменностью. Результатом только чистых функций является возвращаемое значение. Они детерминированы.
Программы, созданные с использованием функционального программирования, легко отлаживать, поскольку чистые функции не имеют побочных эффектов или скрытого ввода-вывода. Чистые функции также упрощают написание параллельных / параллельных приложений. Когда код написан в этом стиле, умный компилятор может делать много вещей - он может распараллеливать инструкции, ждать, чтобы оценить результаты, когда они нужны, и запоминать результаты, поскольку результаты никогда не меняются, пока входные данные не меняются.
пример чистой функции:

sum (x, y) // сумма - это функция, принимающая x и y в качестве аргументов
    return x + y // сумма возвращает сумму x и y без их изменения

Рекурсия: в функциональных языках нет цикла «for» или «while». Итерация в функциональных языках осуществляется через рекурсию. Рекурсивные функции постоянно вызывают себя, пока не достигнут базовый случай.
пример рекурсивной функции:

фиб (п)
    если (n <= 1)
        возврат 1;
    еще
        вернуть fib (n - 1) + fib (n - 2);

Ссылочная прозрачность: в функциональных программах однажды определенные переменные не изменяют свое значение на протяжении всей программы. Функциональные программы не имеют операторов присваивания. Если нам нужно сохранить какое-то значение, мы вместо этого определяем новые переменные. Это исключает возможность возникновения побочных эффектов, поскольку любую переменную можно заменить ее фактическим значением в любой момент выполнения. Состояние любой переменной постоянно в любой момент.
пример:

x = x + 1 // это изменяет значение, присвоенное переменной x.
          // Значит, выражение непрозрачно по ссылкам. 

Функции первого класса и могут быть высшего порядка: функции первого класса рассматриваются как переменные первого класса. Переменные первого класса могут быть переданы функциям в качестве параметра, могут быть возвращены из функций или сохранены в структурах данных. Функции высшего порядка - это функции, которые принимают другие функции в качестве аргументов и могут также возвращать функции.
пример:

show_output (f) // функция show_output объявляется с аргументом f 
                          // которые являются другой функцией
    f (); // вызов переданной функции

print_gfg () // объявление другой функции 
    печать ("привет, gfg");

show_output (print_gfg) // передача функции в другую функцию

Переменные неизменяемы: в функциональном программировании мы не можем изменять переменную после ее инициализации. Мы можем создавать новые переменные, но мы не можем изменять существующие переменные, и это действительно помогает поддерживать состояние в течение всего времени выполнения программы. Создав переменную и установив ее значение, мы можем быть полностью уверены в том, что значение этой переменной никогда не изменится.

Преимущества и недостатки функционального программирования

Преимущества:

  1. Чистые функции легче понять, потому что они не меняют никаких состояний и зависят только от вводимых им входных данных. Какой бы результат они ни производили, они возвращают возвращаемое значение. Их сигнатура функции дает всю информацию о них, то есть их тип возвращаемого значения и их аргументы.
  2. Способность языков функционального программирования обрабатывать функции как значения и передавать их функциям в качестве параметров делает код более читаемым и понятным.
  3. Тестировать и отлаживать проще. Поскольку чистые функции принимают только аргументы и производят вывод, они не производят никаких изменений, не принимают ввод и не производят скрытый вывод. Они используют неизменяемые значения, поэтому становится проще проверять некоторые проблемы в программах, написанных с использованием чистых функций.
  4. Он используется для реализации параллелизма / параллелизма, потому что чистые функции не изменяют переменные или любые другие данные вне его.
  5. Он принимает ленивую оценку, которая позволяет избежать повторной оценки, потому что значение оценивается и сохраняется только тогда, когда это необходимо.

Недостатки:

  1. Иногда написание чистых функций может снизить удобочитаемость кода.
  2. Написание программ в рекурсивном стиле вместо использования циклов может быть немного пугающим.
  3. Написание чистых функций легко, но объединение их с остальными приложениями и операциями ввода-вывода - сложная задача.
  4. Неизменяемые значения и рекурсия могут привести к снижению производительности.

Приложения:

  • Он используется в математических вычислениях.
  • Он нужен там, где требуется параллелизм или параллелизм.

Факт: Whatsapp нужно всего 50 инженеров для своего 900-миллионного пользователя, потому что Erlang используется для реализации его потребностей в параллелизме. Facebook использует Haskell в своей системе защиты от спама.

Вниманию читателя! Не прекращайте учиться сейчас. Получите все важные концепции теории CS для собеседований SDE с курсом теории CS по доступной для студентов цене и будьте готовы к отрасли.