«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Каррирование JavaScript

Каррирование JavaScript

Опубликовано 7 августа 2024 г.
Просматривать:856

JavaScript Currying

Каррирование — это мощная концепция функционального программирования, которая преобразует функцию с несколькими аргументами в последовательность функций, каждая из которых принимает один аргумент. Этот метод позволяет создавать более модульный и повторно используемый код. В JavaScript каррирование можно реализовать различными способами. В этом блоге мы рассмотрим каррирование, приведем примеры и обсудим различные методы достижения каррирования n аргументов.

Что такое карринг?

Каррирование — это процесс преобразования функции, принимающей несколько аргументов, в серию функций, каждая из которых принимает один аргумент. Например, функцию f(a, b, c) можно преобразовать в f(a)(b)(c).

Зачем использовать каррирование?

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

Простой пример каррирования

Давайте начнем с простого примера, чтобы понять, как работает каррирование.

Некаррированная функция

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

function add(a, b, c) {
  return a   b   c;
}

console.log(add(1, 2, 3)); // Output: 6

Объяснение: Эта функция add принимает три аргумента a, b и c и возвращает их сумму. Когда мы вызываем add(1, 2, 3), он возвращает 6.


Каррированная функция

Теперь давайте преобразуем эту функцию в каррированную версию:

function curryAdd(a) {
  return function(b) {
    return function(c) {
      return a   b   c;
    };
  };
}

console.log(curryAdd(1)(2)(3)); // Output: 6

Объяснение: Функция curryAdd принимает аргумент a и возвращает функцию, принимающую аргумент b, которая, в свою очередь, возвращает функцию, принимающую аргумент c. Последняя функция возвращает сумму a, b и c. Когда мы вызываем curryAdd(1)(2)(3), он последовательно передает аргументы 1, 2 и 3 через вложенные функции, в результате чего получается 6.

Каррирование с помощью стрелочных функций

Стрелочные функции JavaScript предоставляют краткий способ создания каррированных функций.

const curryAddArrow = a => b => c => a   b   c;

console.log(curryAddArrow(1)(2)(3)); // Output: 6

Объяснение: Функция curryAddArrow — это стрелочная функция, которая принимает аргумент a и возвращает другую стрелочную функцию, принимающую b, которая возвращает еще одну стрелочную функцию, принимающую c. Последняя стрелочная функция возвращает сумму a, b и c. Когда мы вызываем curryAddArrow(1)(2)(3), он последовательно передает аргументы 1, 2 и 3 через вложенные стрелочные функции, в результате чего получается 6.


Вариант использования

1. Функции конфигурации

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

function logger(level) {
  return function (message) {
    console.log(`[${level}] ${message}`);
  };
}

const infoLogger = logger('INFO');
const errorLogger = logger('ERROR');

infoLogger('This is an info message');
errorLogger('This is an error message');

2. Форматирование строк

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

function formatter(prefix) {
  return function (suffix) {
    return function (str) {
      return `${prefix}${str}${suffix}`;
    };
  };
}

const htmlFormatter = formatter('')('');
console.log(htmlFormatter('Hello')); // Hello

const parensFormatter = formatter('(')(')');
console.log(parensFormatter('123')); // (123)

Каррирование в современных библиотеках JavaScript

Каррирование обычно используется в современных библиотеках JavaScript, таких как Lodash и Ramda. Например, в Lodash вы можете использовать метод _.curry для простого создания каррированных функций.

const _ = require('lodash');

function multiply(a, b, c) {
  return a * b * c;
}

const curriedMultiply = _.curry(multiply);

console.log(curriedMultiply(2)(3)(4)); // 24
console.log(curriedMultiply(2, 3)(4)); // 24

Каррирование с N аргументами

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

function curryAddition(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    } else {
      return function(...nextArgs) {
        return curried(...args, ...nextArgs);
      };
    }
  };
}

// This function sums an array of numbers
function add(...nums) {
  return nums.reduce((acc, num) => acc   num, 0);
}

// Creating a curried version of the addition function
const curriedAdd = curryAddition(add);

// Function to handle n arguments
function curriedAddN(...initialArgs) {
  function adder(...args) {
    if (args.length === 0) {
      return curriedAdd(...initialArgs);
    }
    initialArgs.push(...args);
    return adder;
  }
  return adder;
}

// Examples
const addFiveNumbers = curriedAddN();
console.log(addFiveNumbers(1)(2)(3)(4)(5)()); // 15

const addThreeNumbers = curriedAddN(1)(2)(3);
console.log(addThreeNumbers()); // 6

const addNumbersInSteps = curriedAddN(1, 2)(3)(4, 5);
console.log(addNumbersInSteps()); // 15

Заключение

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/rahulvijayvergiya/javascript-currying-op2?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3