Функциональное программирование существует очень давно, начиная с 50-х годов, когда появился язык программирования Lisp; и если в последние два года вы обращали внимание на такие языки, как Clojure, Scala, Erlang, Haskell и Elixir наделали много шума и привлекли к себе внимание.

Но что такое функциональное программирование, почему все сходят с ума по нему и почему, черт возьми, все больше людей не используют его? В этом посте я попытаюсь ответить на все эти вопросы и, надеюсь, заинтересует вас идеей функционального программирования.

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

Как мы уже говорили ранее, функциональное программирование началось еще в 50-х годах, когда был создан Lisp для работы в серии научных компьютеров IBM700 / 7000. Lisp представил множество парадигм и функций, которые сегодня ассоциируются у нас с функциональным программированием, и хотя мы можем назвать Lisp дедушкой функционального программирования, мы можем пойти еще дальше к общему корню между всеми языками функционального программирования, Лямбда-исчисление.

Это, безусловно, самый интересный аспект функционального программирования; все языки функционального программирования основаны на одной простой математической основе - лямбда-исчислении.

Лямбда-исчисление является полным по Тьюрингу, то есть это универсальная модель вычислений, которую можно использовать для моделирования любой однопленочной машины Тьюринга. [1] Его тезка, греческая буква лямбда (λ), используется в лямбда-выражениях и лямбда-терминах для обозначения привязки переменной в функции. - Википедия

Лямбда-исчисление - удивительно простая, но мощная концепция. В основе лямбда-исчисления лежат две концепции:

  • Абстракция функций, которая используется для обобщения выражений путем введения имён (переменных).
  • Приложение-функция, которое используется для оценки обобщенных выражений путем присвоения имен конкретным значениям.

Давайте посмотрим на пример, функцию с одним аргументом f, которая увеличивает аргумент на единицу:

f = λ x. x+1

Допустим, мы хотим применить функцию к числу 5; тогда функцию можно будет прочитать так:

f(5) => 5 + 1

Основы функционального программирования

А пока достаточно математики, давайте взглянем на функции, которые делают функциональное программирование мощной концепцией:

Первоклассные функции

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

double = fn(x) -> x * 2 end

And as such we can easily call the function as follows:

double.(2)

Функции высшего порядка

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

double = fn(x) -> x * 2 end 
Enum.map(1..10, double)

В этом случае Enum.map принимает перечислимый список - в качестве первого аргумента, а функцию, которую мы только что определили, - в качестве второго; и применяет функцию к каждому элементу перечисляемого, в результате чего:

[2,4,6,8,10,12,14,16,18,20]

Неизменяемое состояние

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

Как и раньше, давайте воспользуемся Эликсиром, чтобы проиллюстрировать эти концепции:

iex> tuple = {:ok, "hello"}
{:ok, "hello"}
iex> put_elem(tuple, 1, "world")
{:ok, "world"}
iex> tuple
{:ok, "hello"}

В этом примере наш кортеж никогда не будет изменять значения, в третьей строке put_elem возвращает полностью новый кортеж без изменения значений оригинала.

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

  • Функциональное программирование существует уже давно (начало 50-х годов).
  • Функциональное программирование основано на математических концепциях, в частности на лямбда-исчислении.
  • Функциональное программирование было сочтено слишком медленным по сравнению с императивными языками
  • Функциональное программирование возвращается.

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

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

Объектно-ориентированное программирование просто больше не сокращает его, особенно когда речь идет о параллелизме и параллелизме; Попытка добавить к этим языкам параллелизм и параллелизм значительно усложняет задачу и чаще всего приводит к излишнему проектированию и снижению производительности.

С другой стороны, функциональное программирование уже хорошо подходит для решения этих задач, Неизменяемое состояние, Замыкания и Функции высокого порядка, концепции, которые очень хорошо подходят для написания высоко конкурентных и распределенных приложений.

Но не верьте мне на слово, вы можете найти достаточно доказательств, просмотрев технологические ленты таких стартапов, как WhatsApp и Discord:

  • WhatsApp смог поддержать 900 миллионов пользователей всего с 50 инженерами в своей команде с помощью Erlang.
  • Discord аналогичным образом обрабатывает более миллиона запросов в минуту с помощью Эликсира.

Эти компании и команды способны справиться с этим массовым ростом благодаря преимуществам функционального программирования, а также по мере того, как функциональное программирование приобретает все большую популярность; Я твердо верю, что такие истории, как WhatsApp и Discord, будут становиться все более и более распространенными.

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

Наконец, если у вас есть какие-либо комментарии, исправления или вы хотите узнать больше по теме, не стесняйтесь оставлять комментарии чуть ниже.

Эта статья изначально была размещена на моем собственном сайте.

Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсуждать рекламные и спонсорские возможности.

Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!