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

Ответ

Функциональное программирование (ФП) основывается на нескольких ключевых принципах:

  1. Чистые функции – функции без побочных эффектов, которые для одних и тех же входных данных всегда возвращают одинаковый результат.
    // Чистая функция
    const add = (a, b) => a + b;
  1. Неизменяемость (Immutability) – данные не изменяются, а создаются новые.
    const arr = [1, 2, 3];
    const newArr = [...arr, 4]; // вместо arr.push(4)
  1. Функции высшего порядка – функции, принимающие или возвращающие другие функции.
    const map = (arr, fn) => arr.map(fn);
  1. Рекурсия – замена циклов вызовами функции самой себя.

  2. Композиция функций – объединение функций в цепочки.

    const compose = (f, g) => x => f(g(x));
  1. Каррирование – преобразование функции с множеством аргументов в цепочку функций с одним аргументом.
    const add = a => b => a + b;
    add(2)(3); // 5

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

Ответ 18+ 🔞

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

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

// Чистая функция
const add = (a, b) => a + b;

Всё, блядь! Никаких сюрпризов. add(2, 2) всегда будет 4, а не "ой, а я тут пока тебе считал, ещё и письмо твоей тёще отправил, извини".

Дальше у них идёт неизменяемость, или, по-русски, "не лезь, сука, в чужое". Ты взял массив — он святой, блядь. Хочешь добавить элемент? Не пушь туда, пидор! Создай новый, на основе старого.

const arr = [1, 2, 3];
const newArr = [...arr, 4]; // вместо arr.push(4), который всё сломает, падла!

Потом идут функции высшего порядка. Звучит умно, а на деле — функция, которая либо жрёт другие функции, либо их срёт. Ну, типа командир, который командует другими командирами. Вот, например, map — классика жанра:

const map = (arr, fn) => arr.map(fn);

А ещё они рекурсию обожают, эти извращенцы! Вместо нормального цикла for, они будут вызывать функцию саму из себя, пока стек не переполнится и всё не накроется медным тазом. Но зато красиво, блядь, математически чисто!

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

const compose = (f, g) => x => f(g(x));

Смотри: взял функцию g, прогнал через неё x, результат запихнул в функцию f. Всё, компот готов. Элегантно, сука, до охуения!

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

const add = a => b => a + b;
add(2)(3); // 5

Сначала ты даёшь ей 2, а она тебе возвращает новую функцию, которая ждёт 3. Зачем? А хуй его знает! Зато прикольно, и для каких-то ихних, ебаных, абстрактных паттернов сгодится.

Короче, вся эта движуха — чтобы код был предсказуемым, как поезд по расписанию, тестируемым, как лабораторная крыса, и декларативным, то есть ты говоришь "что" сделать, а не "как". А "как" — это уже их, функциональных гениев, забота. Сидят, блядь, думают, как бы ещё одну монаду прикрутить, чтобы всех окончательно с ума свести.