Функциональное программирование существует очень давно, начиная с 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, будут становиться все более и более распространенными.
По этой причине функциональное программирование должно быть обязательным элементом в арсенале знаний каждого разработчика, вам необходимо быть готовым к созданию приложений следующего поколения, которые будут обслуживать следующий миллиард пользователей ; и черт возьми, если этого было недостаточно, поверьте мне, функциональное программирование - это действительно весело, просто взгляните на Эликсир:
- Введение в Эликсир
- Узнай Эликсир в увлекательной игровой форме
- 4 причины, по которым нам нравится программировать на эликсире
Наконец, если у вас есть какие-либо комментарии, исправления или вы хотите узнать больше по теме, не стесняйтесь оставлять комментарии чуть ниже.
Эта статья изначально была размещена на моем собственном сайте.
Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсуждать рекламные и спонсорские возможности.
Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!