Рубрики
Без рубрики

Что такое функциональное программирование? Объяснил на Python, JS и Java

Функциональное программирование (FP) – это процесс построения программного обеспечения путем составления чистых функций. Настоящее время … Tagged с функциональным, учебным пособием, Python, JavaScript.

Функциональное программирование (FP) – это процесс построения программного обеспечения путем составления чистые функции. В настоящее время работодатели ищут программистов, которые могут опираться на несколько парадигм для решения проблем. Функциональное программирование особенно приобретает популярность благодаря своей эффективности и масштабируемости для решения современных проблем.

Но как вы можете сделать прыжок от ООП на FP?

Сегодня мы рассмотрим основные концепции функционального программирования и покажем вам, как их реализовать в Python, Javascript и Java!

Вот что мы рассмотрим сегодня:

  • Что такое функциональное программирование?
  • Функциональные языки программирования
  • Концепции функционального программирования
  • Функциональное программирование с Python
  • Функциональное программирование с JavaScript
  • Функциональное программирование с Java
  • Чему научиться дальше

Узнайте свой первый функциональный язык: Scala

Овладеть основами Scala бесплатно, без предыдущего опыта, и вы перейдите на свой функциональный программирование на следующий уровень.

Узнайте Scala с нуля

Что такое функциональное программирование?

Функциональное программирование – это декларативная парадигма программирования, где программы создаются путем применения последовательные функции, а не операторы Анкет

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

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

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

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

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

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

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

  • Легкая отладка : Чистые функции и неизменные данные позволяют легко найти, где устанавливаются значения переменных. Чистые функции имеют меньше факторов, влияющих на них, и, следовательно, позволяют вам легче найти раздел с ошибкой.
  • Ленивая оценка : Функциональные программы оценивают только вычисления в настоящее время. Это позволяет программе повторно использовать результаты из предыдущих вычислений и сохранять среду выполнения.
  • Модульный : Чистые функции не полагаются на внешние переменные или состояния для функционирования, а это означает, что они легко повторно используются по всей программе. Кроме того, функции выполнят только одну операцию или вычисления, чтобы убедиться, что вы можете повторно использовать эту функцию без случайного импорта дополнительного кода.
  • Улучшенная читаемость : Функциональные программы легко читаются, потому что поведение каждой функции неизменно и изолируется от состояния программы. В результате вы можете предсказать, что каждая функция будет выполнять часто только по имени!
  • Параллельное программирование : Проще создавать параллельные программы с подходом функционального программирования, потому что неизменные переменные уменьшают объем изменения в программе. Каждая функция должна иметь дело только с пользовательским вводом и может доверять, что состояние программы останется в основном одинаковым!

Функциональные языки программирования

Не все языки программирования поддерживают функциональное программирование. Некоторые языки, такие как Haskell, предназначены для функциональных языков программирования. , Другие языки, такие как JavaScript, имеют функциональные возможности и возможности ООП, а другие вообще не поддерживают функциональные программы.

Функциональные языки программирования:

  • Хаскелл : Это четкий любимый язык для функционального программирования. Он безопасен для памяти, имеет отличную сборку мусора и быстро из -за раннего компиляции машинного кода. Богатая и статическая система типирования Haskell дает вам доступ к уникальным алгебраическим и полиморфным типам, которые делают функциональное программирование более эффективным и проще для чтения.

  • Erlang : Этот язык и потомки, Эликсир, создали нишу как лучший функциональный язык для одновременных систем. Хотя это не так популярно или широко используется, как Haskell, он часто используется для бэкэнд -программирования. Эрланг в последнее время приобрел тягу для приложений для обмена сбоя, таких как WhatsApp и Discord.

  • Clojure : Этот язык является первым функциональным диалектом LISP, используемого на виртуальной машине Java (JVM). Это преимущественно функциональный язык, который поддерживает как изменяемые, так и неизменные структуры данных, но он менее функционален, чем другие здесь. Если вам нравится LISP, вам понравится Clojure.

  • F# : F# похож на Haskell (они в одной языковой группе), но имеет менее продвинутые функции. Он также имеет незначительную поддержку объектно-ориентированных конструкций.

Функциональные языки:

  • Скала : Скала поддерживает как ООП, так и функциональное программирование. Это наиболее интересная особенность – сильная статическая система типирования, похожая на Haskell’s, которая помогает создавать сильные функциональные программы. Скала была разработана для решения критики Java и, следовательно, является хорошим языком для разработчиков Java, которые хотят попробовать функциональные программы.

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

  • Python, PHP, C ++ : Эти многопарадигмы поддерживают функциональное программирование, но имеют неполную поддержку по сравнению со Scala и JavaScript.

  • Java : Java-это язык общего назначения, но ООП на основе классов на основе классов. Добавление Lambda Expressions позволяет вам ограничить более функциональный стиль. Java в конечном итоге – это язык ООП, который может достичь функционального программирования, но не хватает ключевых функций, чтобы сделать сдвиг достойной того.

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

Функциональные программы разработаны с учетом нескольких основных понятий.

Переменные и функции

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

Чистые функции

Чистые функции имеют два свойства:

  • Они не создают побочных эффектов
  • Они всегда производят один и тот же выход, если дают один и тот же вход

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

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

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

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

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

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

Рекурсия

Одним из основных различий между объектно-ориентированным программированием и функциональным программированием является то, что функциональные программы избегают конструкций, таких как операторы IF-ELSE или петли, которые могут создавать различные выходы при каждом выполнении.

Функциональные программы используют рекурсию вместо циклов для всех итерационных задач.

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

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

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

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

Функциональная композиция

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

Продолжайте обучение функциональному программированию бесплатно

Научитесь использовать Scala для создания собственных функциональных программ бесплатно. Следующие курсы Educative основаны на текстовых основаниях и предназначены для быстрого опыта.

Узнайте Scala с нуля

Функциональное программирование с Python

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

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

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

Давайте посмотрим, как достичь чистых, неизменных функций и первоклассных функций в Python. Затем мы узнаем синтаксис для сочинения функций.

Чистые и неизменные функции

Многие из встроенных структур данных Python по умолчанию неизменны:

  • целое число
  • плавать
  • логический
  • нить
  • Unicode
  • кортеж

ПУЛЕЙ Особенно полезны в качестве неизменной формы массива.

# Python code to test that  
# tuples are immutable  

tuple1 = (0, 1, 2, 3)  
tuple1[0] = 4
print(tuple1)

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

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

def add_1(x):
    return x + 1

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

Функции рассматриваются как объекты в Python. Вот наше быстрое руководство по тому, как вы можете использовать функции в Python:

Функционирует как объекты

def shout(text): 
    return text.upper()

Пропустить функцию как параметр

def shout(text): 
    return text.upper() 

def greet(func): 
    # storing the function in a variable 
    greeting = func("Hi, I am created by a function passed as an argument.") 
    print greeting  

greet(shout) 

Возвращение функции из другой функции

def create_adder(x): 
    def adder(y): 
        return x+y 

    return adder 

Функциональная композиция

Чтобы составить функции в Python, мы будем использовать Lambda функция вызов. Это позволяет нам вызывать любое количество аргументов за один вызов.

import functools

def compose(*functions):
    def compose2(f, g):
        return lambda x: f(g(x))
    return functools.reduce(compose2, functions, lambda x: x)

В строка 4 , мы определим функцию compose2 Это принимает две функции в качестве аргументов f и грамм . В строка 5 , мы возвращаем новую функцию, которая представляет композицию f и G Анкет

Наконец, в строка 6 , мы возвращаем результаты нашей функции композиции.

Функциональное программирование в JavaScript

JavaScript давно предлагает функциональные возможности благодаря своей поддержке первоклассных функций. Функциональное программирование в последнее время стало более популярным в JavaScript, потому что оно повышает производительность при использовании в таких фреймворках, как Угловой и Реагировать Анкет

Давайте посмотрим, как достичь разных функциональных концепций с помощью JavaScript. Мы сосредоточимся на том, как создать основные концепции; Чистые функции, первоклассные функции и композиции функций.

Чистые и неизменные функции

Чтобы начать создавать чистые функции в JavaScript, мы должны использовать функциональные альтернативы общего поведения, такие как констант , concat и Filter () Анкет

пусть Ключевое слово устанавливает изменчивую переменную. Объявляя с const Вместо этого гарантирует, что переменная неизменна, поскольку она предотвращает переназначение.

const heightRequirement = 46;

function canRide (height){
    return height >= heightRequirement;
}

Нам также необходимо использовать функциональные альтернативы для манипулирования массивами. push () Метод – это обычный способ добавить элемент на массив. К сожалению, push () изменяет исходный массив и поэтому является нечистым.

Вместо этого мы будем использовать функциональный эквивалент, concat () Анкет Этот метод возвращает новый массив, который содержит все оригинальные элементы, а также недавно добавленный элемент, исходный массив не изменяется при использовании concat () Анкет

const a = [1, 2]
const b = [1, 2].concat(3)

Чтобы удалить элемент из массива, мы обычно использовали pop () и slice () методы Однако они не являются функциональными, поскольку они изменяют исходный массив. Вместо этого мы будем использовать Filter () Это создает новый массив, который содержит все элементы, которые проходят условное испытание.

const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];

const result = words.filter(word => word.length > 6);

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

JavaScript поддерживает первоклассные функции по умолчанию. Вот краткое руководство того, что мы можем сделать с функциями в JavaScript.

Назначить функцию переменной

const f = (m) => console.log(m)
f('Test')

Добавить функцию в массив

const a = [
  m => console.log(m)
]
a[0]('Test')

Пройти функцию как аргумент

const f = (m) => () => console.log(m)
const f2 = (f3) => f3()
f2(f('Test'))

Возвращение функции из другой функции

const createF = () => {
  return (m) => console.log(m)
}
const f = createF()
f('Test')

Функциональная композиция

В JavaScript мы можем составлять функции с прицепами функций с цепью:

obj.doSomething()
   .doSomethingElse()

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

obj.doSomething(doThis())

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

Первая функция в списке использует исходный аргумент в качестве ввода. Более поздние функции наследуют входной аргумент от возвращаемого значения функции перед ней.

import { compose } from 'lodash/fp'

const slugify = compose(
  encodeURIComponent,
  join('-'),
  map(toLowerCase),
  split(' ')
)

slufigy('Hello World') // hello-world

Функциональное программирование на Java

Java действительно не поддерживает функциональное программирование, как это делает Python или JavaScript. Тем не менее, мы можем имитировать поведение функционального программирования в Java, используя функции Lambda, потоки и анонимные классы.

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

Чистые и неизменные функции

Несколько встроенных структур данных Java неизменны:

  • целое число
  • логический
  • байт
  • короткая
  • нить

Вы также можете создать свои собственные неизменные классы с окончательный ключевое слово.

// An immutable class 
public final class Student 
{ 
    final String name; 
    final int regNo; 

    public Student(String name, int regNo) 
    { 
        this.name = name; 
        this.regNo = regNo; 
    } 
    public String getName() 
    { 
        return name; 
    } 
    public int getRegNo() 
    { 
        return regNo; 
    } 
} 

окончательный Ключевое слово в классе предотвращает построение детского класса. окончательный на имя и Regno Сделайте невозможным изменить значения после построения объекта.

Этот класс также имеет параметризованный конструктор, методы Getter для всех переменных и никаких методов сеттера, которые каждый помогает сделать это неизменным классом.

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

Java может использовать функции Lambda для достижения первоклассных функций. Lambda берет список выражений, таких как метод, но не нуждается в названии или для предопределенного.

Мы можем использовать Lambda Expressions вместо функций, поскольку они рассматриваются как стандартные объекты класса, которые могут быть переданы или возвращены.

// FIRST-CLASS
Supplier lambda = myObject::toString;
// HIGHER-ORDER
Supplier higherOrder(Supplier fn) {
    String result = fn.get();
    return () -> result;
}

Функциональная композиция

Java содержит интерфейс, java.util.function. Функция , это дает методы для функциональной композиции. Составьте Метод сначала выполняет пропущенную функцию ( multiplybyten ) затем передает возвращение к внешней функции ( square ). и жаль Метод выполняет внешнюю функцию сначала а затем функция в пределах его параметров.

Function square = (input) -> input * input;
Function multiplyByTen = (input) -> input * 10;

// COMPOSE: argument will be run first
Function multiplyByTenAndSquare = square.compose(multiplyByTen);

// ANDTHEN: argument will run last
Function squareAndMultiplyByTen = square.andThen(multiplyByTen);

В строках 1 и 2 , мы сначала создаем две функции, квадрат и Умноженная Анкет Далее в строки 5 и 8 , мы делаем 2 составных функции умноженная и квадрат и SquareAndmultiplybyten что каждый принимает два аргумента (чтобы удовлетворить square ).

Эти составные функции выполняют как исходные функции, но и в разных порядках. Теперь вы можете вызвать композитные функции, чтобы выполнить обе исходные функции на одном и том же входе.

Чему научиться дальше

Сегодня мы рассмотрели некоторые общие концепции функционального программирования и исследовали, как эти основные концепции появляются в Python, Javascript и Java.

Одним из лучших языков программирования, создавающим возрождение, является Скала Анкет Многие технологические гиганты, такие как Twitter и Facebook, приняли Scala.

Чтобы помочь вам быстро выучить Scala, образовательное образование создало курс Узнайте Scala с нуля Анкет Этот курс начинается с нуля и дает вам все, что вам нужно знать, чтобы быстро писать свои собственные программы. В конце концов вы рассмотрели все уникальные функциональные функциональные функциональные функции Scala.

Счастливого обучения!

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

Оригинал: “https://dev.to/educative/what-is-functional-programming-explained-in-python-js-and-java-2nal”