Автор оригинала: Muhammad Kasim.
Привет мир!
JavaScript – это многорадигматический язык программирования, что означает, что он поддерживает как процедурное, так и функциональное программирование. Функциональное программирование позволяет делать удовольствие, почти волшебные вещи. Дело в точке: карри. В этом посте мы постараемся понять, что такое карри и как реализовать его простым способом.
Функции высшего порядка
Для реализации Carrying мы должны узнать о функциях более высокого порядка. Так что же является HOF?
Когда мы говорим о функциях более высокого порядка, мы имеем в виду функцию, которая либо принимает одну или несколько функций в качестве аргументов, либо возвращает функцию в качестве результата.
Вы найдете функции более высокого порядка в языках программирования, которые поддерживают функции первого класса (или функции лечения в качестве первого класса). Это означает язык, который позволяет нам хранить функции в переменных, передавать их в качестве параметров в функциональных вызовах или возвращать их в результате другого вызова функции.
Whaw! Это звучит сложно. Ну, это не так. Потому что, скорее всего, вы уже используете HOFS в вашем коде. Помните карту, фильтр и уменьшите? Они являются функциями более высокого порядка.
Давайте сделаем простую функцию более высокого порядка.
const doubleFunc = fn => { return (...args) => { return 2 * fn(...args); }; };
Так что происходит здесь?
Мы написали функцию под названием Doublefuncebunc
это делает функцию FN
В качестве аргумента и возвращает новую функцию, которая принимает произвольное количество аргументов. На нашем предоставлении этого произвольного количества аргументов этой функции это тогда применяет FN
К ним, умножает результат на 2 и возвращает результат.
Мы собрали произвольное количество аргументов в массив ARGS выше, используя оператор SPRECT/REST (…) в ES6. Узнайте больше об этом в потрясающей книге Кайл Симпсона здесь Отказ
const add = (x, y) => x + y; const doubleAdd = doubleFunc(add); console.log(doubleAdd(1, 4)); //=> 10
Прохладный? Прохладный.
Карри
Теперь, когда мы понимаем, что такое функция более высокого порядка, как мы можем использовать эти знания, чтобы сделать утилиту Carrry? Давайте сначала определимся карри.
Carrying – это процесс принятия функции с несколькими аргументами и возвращает ряд функций, которые принимают один аргумент и в конечном итоге разрешают значение.
Хорошо, это немного трудно обернуть голову. В простых терминах Carrying – это процесс преобразования функции, которая принимает несколько аргументов в функцию, которая принимает меньшие аргументы, фиксируя некоторые из аргументов.
Давайте напишем пару функций приращения, модифицируя Добавить
Отказ
const add = x => y => x + y; const inc1 = add(1); const inc2 = add(2); inc1(4); //=> 5 inc2(4); //=> 6
Большой! Кричаю наше Добавить
Функция, мы сделали свою логику многоразовой и вытащили 2 функции от нее.
Это нормально и все, кроме как мы можем карри любые функции? Давайте напишем полезность для этого.
function curry(fn) { return function(...args) { if (args.length >= fn.length) { return fn(...args); } return function(...more) { return curry(fn)(...args, ...more); }; }; }
Хорошо, давайте сломаемся. Мы написали функцию под названием Карри
это делает функцию FN
В качестве аргумента и возвращает функцию N-ARITY (функция, которая принимает произвольное количество аргументов). Теперь эта функция делает пару вещей.
- Если количество аргументов, предусмотренных этой функцией, равно или больше, чем количество аргументов, необходимых функцией
FN
это просто вызываетFN
с этими аргументами. - В противном случае он возвращает другую функцию N-ARITE, которая при предоставленной некоторые
Подробнее
Аргументы, пытаются вызвать CurriedFN
сargs
иПодробнее
Отказ
Этот процесс продолжает идти до тех пор, пока состояние на шаге 1 не удовлетворено.
Если вы не понимаете, что здесь происходит, я рекомендую вам скопировать эту утилиту, добавить в нее в систему и использовать его, чтобы карри простую функцию самостоятельно.
Вышеуказанный фрагмент слишком многословным. Давайте переписам его со стрелками функциями.
const curry = fn => (...args) => args.length >= fn.length ? fn(...args) : (...more) => curry(fn)(...args, ...more);
Намного круче! Давайте использовать эту недавно обнаруженную мощность.
const sort = (ascend, list) => { const ascCmp = (a, b) => a > b; const dscCmp = (a, b) => a < b; return [...list].sort(ascend ? ascCmp : dscCmp); }; const curriedSort = curry(sort); const sortAsc = curriedSort(true); const sortDsc = curriedSort(false); const data = [9, 99, 29, 42, 45, 57, 13]; sortAsc(data); //=> [9, 13, 29, 42, 45, 57, 99] sortDsc(data); //=> [99, 57, 45, 42, 29, 13, 9]
Currying Сортировать
мы смогли Частично применять Функция, фиксируя значение подняться
Флаг и хранение полученной функции, которая теперь принимает только список номеров, до отдельной переменной.
Частично применение функций может помочь нам повторно использовать наши функции более чистым способом. Мы даже можем пройти эти частично примененные функции вокруг в нашем приложении для отсроченной оценки по линии выполнения, когда остальные аргументы будут доступны нам.
Функции более высокого порядка являются хлеб и масло функционального программирования, а в карри и частично применяемых функциях позволяют использовать функции более высокого порядка, которые будут использоваться гораздо более эффективно и кратко. Но HOFS включает намного больше, чем просто карри, такие вещи, как состав,
Если вам понравился этот вкус функционального программирования в JS, вы должны проверить эти функциональные библиотеки программирования: Рамда и Лоташ/FP Отказ
Вот это для карри, парней. Надеюсь, вы узнали что-то об этой классной технике. Если вам понравилось этот пост, пожалуйста, хлопайте и делитесь. Чао!