Функциональное программирование (FP) — это процесс создания программного обеспечения путем составления чистых функций. В настоящее время работодатели ищут программистов, которые могут использовать несколько парадигм для решения проблем. Функциональное программирование особенно набирает популярность благодаря своей эффективности и масштабируемости для решения современных проблем.
Но как перейти от ООП к FP?
Сегодня, мы исследуем основные концепции функционального программирования и покажем вам, как реализовать их на Python, JavaScript и Java!
Вот что мы рассмотрим сегодня:
- Что такое функциональное программирование?
- Языки функционального программирования
- Концепции функционального программирования
- Функциональное программирование с помощью Python
- Функциональное программирование с помощью JavaScript
- Функциональное программирование с помощью Java
- Что изучать дальше
- Изучите свой первый функциональный язык
- Что такое функциональное программирование?
- Преимущества функционального программирования
- Функциональные языки программирования
- Функциональные языки программирования:
- Функциональные языки:
- Концепции функционального программирования
- Переменные и функции
- Чистые функции
- Неизменяемость и состояния
- Рекурсия
- Функции первого класса
- Функции высшего порядка
- Функциональная композиция
- Продолжайте изучать функциональное программирование с помощью Python
- Функциональный Программирование с помощью Python
- Чистые и неизменяемые функции
- Функции первого класса
- Функциональная композиция
- Функциональное программирование в JavaScript
- Чистые и неизменяемые функции
- Функции первого класса
- Функциональная композиция
- Функциональное программирование в Java
- Чистые и неизменяемые функции
- Функции первого класса
- Функциональная композиция
- Что изучать дальше
- Продолжить чтение о функциональном программировании
Изучите свой первый функциональный язык
Этот курс обучает основам функционального программирования, его использованию и способам использования в Python. К концу у вас будет новая парадигма программирования, которую вы можете добавить.
Изучите функциональное программирование на Python
Что такое функциональное программирование?
Функциональное программирование — это парадигма декларативного программирования, в которой программы создаются путем применения последовательных функций, а не операторов .
Каждая функция принимает входное значение и возвращает согласованное выходное значение, не изменяя и не подвергаясь влиянию состояния программы.
Эти функции выполняют одну операцию и могут быть составлены последовательно для выполнения сложных операций. Функциональная парадигма приводит к очень модульному коду, поскольку функции могут быть повторно использованы в программе и могут быть вызваны, переданы как параметры или возвращены.
Чистые функции не вызывают побочных эффектов и не зависят от глобальных переменных или состояний.
Функциональное программирование используется, когда решения легко выражаются в функциях и имеют небольшой физический смысл. В то время как объектно-ориентированные программы моделируют код по образцу реальных объектов, функциональное программирование превосходит математические функции , где промежуточные или конечные значения не имеют физической корреляции..
Некоторые распространенные применения функционального программирования — это разработка ИИ, алгоритмы классификации машинного обучения, финансовые программы или сложные математические модели функций.
Упрощенно: функциональные программы последовательно выполняют множество простых одноцелевых функций для решения сложных математических или нефизических задач.
Преимущества функционального программирования
- Простая отладка : чистые функции и неизменяемые данные позволяют легко найти, где установлены значения переменных. Чистые функции имеют меньше факторов, влияющих на них, и, следовательно, позволяют вам легче находить ошибочные разделы.
- Ленивое вычисление : Функциональные программы оценивают вычисления только в тот момент, когда они необходимы. Это позволяет программе повторно использовать результаты предыдущих вычислений и экономить время выполнения.
- Modular : чистые функции не полагаются на внешние переменные или состояния для работы, что означает, что их легко повторно использовать в программе. Кроме того, функции будут выполнять только одну операцию или вычисление, чтобы вы могли повторно использовать эту функцию без случайного импорта дополнительного кода.
- Повышенная читабельность : функциональные программы легко читать, потому что поведение каждой функции неизменяемо и изолировано от состояния программы. В результате вы можете предсказать, что каждая функция будет делать часто, просто по имени!
- Параллельное программирование : легче создавать параллельные программы с помощью подхода функционального программирования, потому что неизменяемые переменные уменьшают количество изменений в программе. Каждая функция должна иметь дело только с вводом пользователя и может быть уверена, что состояние программы останется в основном таким же!
Функциональные языки программирования
Не все языки программирования поддерживают функциональное программирование. Некоторые языки, такие как Haskell, разработаны как языки функционального программирования. Другие языки, такие как JavaScript, обладают функциональными возможностями и возможностями ООП, а другие вообще не поддерживают функциональное программирование.
Функциональные языки программирования:
-
Haskell : это явный любимый язык для функционального программирования. Он безопасен для памяти, имеет отличную сборку мусора и быстрый благодаря ранней компиляции машинного кода. Богатая система статической типизации Haskell дает вам доступ к уникальным алгебраическим и полиморфным типам, которые делают функциональное программирование более эффективным и легким для чтения..
-
Erlang : этот язык и его потомок, Elixir, заняли свою нишу как лучший функциональный язык для параллельных систем. Хотя он не так популярен и широко используется, как Haskell, он часто используется для внутреннего программирования. В последнее время Erlang завоевал популярность в сфере масштабируемых приложений для обмена сообщениями, таких как Whatsapp и Discord.
-
Clojure : этот язык является функциональным. первый диалект Лиспа, используемый на виртуальной машине Java (JVM). Это преимущественно функциональный язык, поддерживающий как изменяемые, так и неизменяемые структуры данных, но менее функциональный, чем другие здесь. Если вам нравится Lisp, вам понравится Clojure.
-
F # : F # похож на Haskell (они в та же языковая группа), но имеет менее продвинутые функции. Он также имеет незначительную поддержку объектно-ориентированных конструкций.
Функциональные языки:
- Scala: Scala поддерживает как ООП, так и функциональное программирование. Самая интересная особенность — сильная система статической типизации, подобная Haskell, которая помогает создавать сильные функциональные программы. Scala был разработан для ответа на критику Java и поэтому является хорошим языком для разработчиков Java, которые хотят попробовать функциональное программирование.
- JavaScript : хотя JS не ориентирован на функциональность, выделяется для функционального программирования своей асинхронной природой. JavaScript также поддерживает важные функции функционального программирования, такие как лямбда-выражения и деструктуризация. Вместе эти атрибуты выделяют JS как лучший язык для функционального программирования среди других языков с несколькими парадигмами.
- Python, PHP, C ++ : эти языки с несколькими парадигмами поддерживают функциональные программирования, но у него неполная поддержка по сравнению со Scala и JavaScript.
- Java : Java — это язык общего назначения, но он выступает впереди ООП на основе классов. Добавление лямбда-выражений позволяет ограниченным образом реализовать более функциональный стиль. В конечном счете, Java — это язык ООП, который может реализовать функциональное программирование, но в нем отсутствуют ключевые функции, которые оправдывают переход.
Концепции функционального программирования
Функциональные программы разрабатываются с учетом нескольких основных концепций.
Переменные и функции
Основные строительные блоки функциональной программы: переменные и функции, а не объекты и методы. Вам следует избегать глобальных переменных, потому что изменяемые глобальные переменные затрудняют понимание программы и приводят к нечистым функциям..
Чистые функции
Чистые функции имеют два свойства:
- они не создают побочных эффектов
- они всегда производят один и тот же результат, если заданы одинаковые входные данные.
Побочные эффекты возникают, если функция изменяет состояние программы, перезаписывает входную переменную, или вообще вносит какие-либо изменения вместе с созданием вывода. Чистые функции менее подвержены ошибкам, поскольку побочные эффекты усложняют состояние программы.
Ссылочная прозрачность означает, что любой вывод функции должен быть заменен его значением без изменения результата программы. Эта концепция гарантирует, что вы создадите функции, которые выполняют только одну операцию и достигают согласованного вывода.
Ссылочная прозрачность возможна только в том случае, если функция не влияет на состояние программы или обычно пытается выполнить более одного
Неизменяемость и состояния
Неизменяемые данные или состояния не могут быть изменены после установки и позволяют стабильной среде для вывода функции быть постоянным. Лучше всего запрограммировать каждую функцию для получения одного и того же результата независимо от состояния программы. Если он полагается на состояние, состояние должно быть неизменным, чтобы гарантировать, что выходные данные функции остаются постоянными.
Подходы функционального программирования обычно избегают функций с общим состоянием (несколько функций, полагающихся на одно и то же состояние) и изменения функции состояния (функция полагается на изменяемую функцию), потому что они делают программы менее модульными. Если вы должны использовать функции общего состояния, сделайте его неизменяемым.
Рекурсия
Одно из основных различий между объектно-ориентированным программированием и функциональным программированием заключается в чтобы функциональные программы избегали таких конструкций, как операторы If-Else
или циклы, которые могут создавать разные выходные данные при каждом выполнении.
Функциональные программы используют рекурсию вместо циклов для всей итерации задачи.
Функции первого класса
Функции в функциональном программировании рассматриваются как тип данных и могут использоваться как любое другое значение. Например, мы заполняем массив функциями, передаем их как параметры или сохраняем в переменных.
Функции высшего порядка
Высшего порядка функции могут принимать другие функции как параметры или возвращать функции как выходные данные. Функции высшего порядка дают нам большую гибкость в том, как мы выполняем вызовы функций и абстрагируемся от действий.
Функциональная композиция
Функции могут выполняться последовательно для выполнять сложные операции. Результат каждой функции передается следующей функции в качестве аргумента. Это позволяет вам вызывать серию функций с помощью всего одного вызова функции.
Продолжайте изучать функциональное программирование с помощью Python
Научитесь использовать Python для создания собственных функциональных программ бесплатно. Скиммируемые курсы Educative основаны на тексте и предназначены для быстрого получения практического опыта.
Изучите функциональное программирование на Python
Функциональный Программирование с помощью Python
Python частично поддерживает функциональное программирование как многопарадигмальный язык. Некоторые решения математических программ на Python легче всего реализовать с помощью функционального подхода.
Самое сложное изменение, которое нужно сделать, когда вы начнете использовать функциональный подход, — это сократить количество используемых классов. Классы в Python имеют изменяемые атрибуты, что затрудняет создание чистых неизменяемых функций.
Вместо этого постарайтесь сохранить большую часть кода на уровне модуля и переключаться на классы только в случае необходимости.
Давайте посмотрим, как добиться чистых неизменяемых функций и первоклассных функций в Python. Затем мы изучим синтаксис для составления функций.
Чистые и неизменяемые функции
Многие встроенные структуры данных Python неизменяемы по умолчанию:
- integer
- float
- boolean
- string
- Unicode
- tuple
Кортежи особенно полезны как неизменяемая форма массива.
# Код Python для проверки # неизменяемости кортежей tuple1 = (0, 1, 2, 3) tuple1 [0] = 4print (tuple1)
Это код вызывает ошибку, потому что он пытается переназначить неизменяемый объект кортежа. Функциональные программы Python должны часто использовать эти неизменяемые структуры данных для достижения чистых функций.
Следующая функция является чистой, потому что она не имеет побочных эффектов и всегда будет возвращать один и тот же результат:
def add_1 (x): return x + 1
Функции первого класса
Функции рассматриваются как объекты в Python. Вот наше краткое руководство по использованию функций в Python:
Функции как объекты
def shout (текст): return text.upper ()
Передать функцию как параметр
def shout (text): return text.upper () def greet (func): # сохранение функции в переменной welcome = func («Привет, я создан функцией, переданной в качестве аргумента.») распечатать приветствие greet (shout )
Возвращает функцию из другой функции
def create_adder (x): def adder (y): return x + y return adder
Функциональная композиция
Чтобы составлять функции в Python, мы будем использовать лямбда-функция
вызов. Это позволяет нам вызывать любое количество аргументов за один вызов.
import functoolsdef compose (* functions): def compose2 (f, g): return lambda x: f ( g (x)) возвращает функции. reduce (compose2, functions, lambda x: x)
В строке 4 мы определим функцию compose2
, который принимает две функции в качестве аргументов f
и g
. В строке 5 мы возвращаем новую функцию, которая представляет собой композицию f
и g
.
Наконец, в строке 6 , мы возвращаем результаты нашей функции композиции.
Функциональное программирование в JavaScript
JavaScript уже давно предлагает функциональные возможности благодаря поддержке первоклассных функций. Функциональное программирование в последнее время стало более популярным в JavaScript, поскольку оно повышает производительность при использовании в таких фреймворках, как Angular и React.
Давайте посмотрим, как реализовать различные функциональные концепции с помощью JavaScript. Мы сосредоточимся на том, как создавать основные концепции; чистые функции, первоклассные функции и функциональные композиции.
Чистые и неизменяемые функции
Чтобы начать создавать чистые функции в JavaScript, мы будем иметь использовать функциональные альтернативы обычного поведения, такие как const
, concat
и filter ()
.
Ключевое слово let
устанавливает изменяемую переменную. Объявление с помощью 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 = ['спрей', 'предел', 'элита', 'обильный', 'разрушение', 'настоящее']; const result = words.filter (word => word.length> 6);
Функции первого класса
JavaScript по умолчанию поддерживает функции первого класса. Вот краткое руководство о том, что мы можем делать с функциями в JavaScript.
Назначить функцию переменной
const f = (m) => консоль. 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 ('Тест') )
Возврат функции из другой функции
const createF = () => { return (m) => console.log (m)} const f = createF () f ('Test')
Функциональная композиция
В JavaScript мы можем составлять функции с помощью связанных вызовов функций:
obj.doSomething () .doSomethingElse ()
В качестве альтернативы мы можем передать выполнение функции следующей функции:
obj.doSomething (doThis ())
Если мы хотим составить больше функций, мы можем вместо этого использовать lodash
, чтобы упростить композицию. В частности, мы будем использовать функцию compose
, которая получает аргумент, а затем список функций.
Первая функция в списке использует исходный аргумент как его ввод. Последующие функции наследуют входной аргумент от возвращаемого значения предыдущей функции.
import {compose} from 'lodash/fp'const slugify = compose (encodeURIComponent, join (' - '), map (toLowerCase), split (' ')) slufigy (' Hello World ')//привет-мир
Функциональное программирование в Java
Java делает на самом деле не поддерживает функциональное программирование, как Python или JavaScript. Однако мы можем имитировать поведение функционального программирования в Java, используя лямбда-функции, потоки и анонимные классы.
В конечном счете, компилятор Java не создавался с учетом функционального программирования и поэтому не может принимать многие из преимущества функционального программирования.
Чистые и неизменяемые функции
Некоторые встроенные структуры данных Java являются неизменяемыми:
- целое число
- логическое
- байтовое
- короткое
- строка
Вы также можете создавать свои собственные неизменяемые классы с помощью ключевого слова final
.
//An неизменный класс public final class Student {final String name; final int regNo; общедоступный Студент (Строковое имя, int regNo) {this.name = name; this.regNo = regNo; } public String getName () {возвращаемое имя; } public int getRegNo () {return regNo; }}
Ключевое слово final
в классе предотвращает создание дочернего класса. final
в name
и regNo
делают невозможным изменение значений после создания объекта..
Этот класс также имеет параметризованный конструктор, методы получения для всех переменных и нет методов установки, каждый из которых помогает сделать этот класс неизменяемым.
Функции первого класса
Java может использовать лямбда-функции для достижения функций первого класса. Лямбда принимает список выражений, таких как метод, но не требует имени или предопределения.
Мы можем использовать лямбда-выражения вместо функций, поскольку они рассматриваются как стандартные объекты класса, которые могут быть передано или возвращено.
//FIRST-CLASSSupplier lambda = myObject :: toString;//HIGHER-ORDERSupplier upperOrder (Supplier fn) { Строка result = fn.get (); return () -> result;}
Функциональная композиция
Java содержит интерфейс, java.util .function.Function
, который предоставляет методы для функциональной композиции. Метод compose
сначала выполняет переданную функцию ( multiplyByTen
), а затем передает возврат внешней функции ( square
). Метод andThen
сначала выполняет внешнюю функцию , а затем функцию в своих параметрах.
Function square = (input) -> input * input; Function multiplyByTen = (input) -> input * 10;//СОСТАВИТЬ: аргумент будет запущен firstFunction multiplyByTenAndSquare = square. compose (multiplyByTen);//ANDTHEN: аргумент будет запускаться lastFunction squareAndMultiplyByTen = square.andThen (multiplyByTen);
В строках 1 и 2 сначала мы создаем две функции: square
и multiplyByTen
. Затем в строках 5 и 8 мы создать 2 составные функции multiplyByTenAndSquare
и squareAndMultiplyByTen
, каждая из которых принимает два аргумента (чтобы удовлетворить square
).
Каждая из этих составных функций выполняет обе исходные функции, но в разном порядке. Теперь вы можете вызывать составные функции для выполнения обеих исходных функций на одном и том же входе.
Что изучать дальше
Сегодня мы рассмотрели некоторые общие концепции функционального программирования и изучили, как эти основные концепции появляются в Python, JavaScript и Java.
Чтобы помочь вам изучить Python для функционального программирования, компания Educative создала курс Изучение функционального программирования на Python . Этот курс начинается с нуля и дает вам все необходимое для быстрого написания собственных программ. К концу вы охватите все уникальные возможности функционального программирования Python..
Удачного обучения!
Продолжить чтение о функциональном программировании
- Возрождение Scala в 2020 г.
- Учебное пособие по Java 8: API основного потока и не только
- Что такое объектно-ориентированное программирование? Подробное объяснение ООП