Функциональное программирование - Глоссарий
Что такое функциональное программирование?
Функциональное программирование (ФП) — это подход в создании ПО с помощью неизменяемых функций. Эта парадигма пытается разделить данные и поведение. Код и компилятор решают, какую последовательность выполнения подпрограмм выбрать, а разработчик лишь задает взаимодействие между компонентами.Основные принципы
Чистые функции
Базовые принципы ФП, когда соблюдены условия: всегда возвращается одинаковый результат и отсутствуют побочные эффекты в процессе выполнения.
Пример на JavaScript:
var z = 10; function add(x, y) { return x + y; }
Неизменяемость данных
Объявленные переменные после инициализации сохраняют неизменяемость, текущая всегда остается прежней с сохранением значения, а для вычислений создается новая.
// Example of creating an immutable array const originalArray = [1, 2, 3]; const immutableArray = [...originalArray, 4];
Функции высшего порядка
Передаются в качестве аргументов или возвращаются, что позволяет писать модульный и повторно используемый код.
// Example of a higher-order function function map(array, fn) { const result = []; for (let i = 0; i < array.length; i++) { result.push(fn(array[i])); } return result; } const numbers = [1, 2, 3]; const doubledNumbers = map(numbers, (num) => num * 2);
Рекурсия и отсутствие циклов
Рекурсия вместо циклов — это способность функций вызывать себя же для выполнения задач и работать внутри друг друга.
// Example of recursion function factorial(n) { if (n === 0) { return 1; } else { return n * factorial(n - 1); } } console.log(factorial(5)); // Output: 120
Функциональные языки программирования
Примеры и особенности
Функциональные языки программирования можно поделить на две условные группы: строго ориентированные и мультипарадигменные. К первой группе относятся Haskell, Erlang, Elixir, F#, OCaml. Ко второй — Go, JavaScript.
Haskell и его роль в развитии функционального программирования
Haskell характеризуется строгой типизацией и «ленивыми» функциями, когда вычисления проводятся только по мере необходимости, а остальное откладываются «на потом». Хаскелл помогает решать практические задачи:
- Создавать ПО
- Разрабатывать другие языки
- Создавать инструменты для анализа языков
- Разрабатывать прикладные приложения
- Обрабатывать данные.
Python и поддержка функционального программирования
Python частично поддерживает парадигму ФП, хотя в меньшей степени, чем Хаскелл. Преимущество в том, что некоторые используемые в Python решения математических программ проще реализуются в функциональном стиле. Недостаток — изменяемость атрибутов в классах Python, что усложняет создание чистых неизменяемых функций.
Преимущества и недостатки функционального программирования
Преимущества
- Легкая настройка
- Отложенное вычисление
- Модульность чистых функций
- Читаемость
- Параллельная разработка.
Ограничения и недостатки
- Неэффективность для разработки алгоритмов, которые построены на императивных принципах.
- Перерасход памяти из-за создания новой переменной, что приводит к снижению производительности.
- Непредсказуемость порядка действий. Например, при хаотичном вводе и выводе ухудшается работа программы.
- Ограниченность применения.
Сравнение с другими парадигмами разработки
Функциональное vs Императивное программирование
Приведем практический пример для понимания разницы между парадигмами. ИП напоминает правила умножения в столбик, когда последовательность действий четко определена в инструкцию. ФП не имеет инструкции, поэтому приходится решать самостоятельно, какое правило будет применимо в каждой ситуации и в какой последовательности.
Функциональное vs Объектно-ориентированное программирование
Объектно-ориентированное программирование использует объекты, а код представляет набор команд для компьютера. ФП представлено в виде функций, когда мы создаем новые данные на основе имеющихся, но запрещаем изменять существующие. Различаются также способы работы с информацией, структура программ и многое другое.
Применение функциональных языков в реальных проектах
ФП помогает решать задачи для разработки высоконагруженных и распределенных программных продуктов. Например, применяется в работе с WhatsApp и Discord, обеспечивая им возможность справляться с мощным ростом пользователей и запросов. 900 млн пользователей WhatsApp поддерживает команда всего из 50 разработчиков, работающих на языке Erlang. Ежеминутные миллионные запросы в Discord поддерживаются с помощью языка Elixir.