Если вы новичок в разработке программного обеспечения, вы, вероятно, столкнулись с термином Карринг И все еще спросите себя, что это за H*ck.
Начнем с основной концепции:
В математике и компьютерной науке «каррики» – это метод преобразования функции, которая вводит несколько аргументов в последовательность функций, каждый из которых принимает один аргумент.
Источник: Википедия
Если это все еще не имеет смысла для вас, не волнуйтесь! Давайте погрузимся в некоторые практические примеры, и вы выясните это.
TL; DR
В этой статье я практически объясняю, что Карринг находится в контексте программирования и как его воспользоваться. Все примеры в JavaScript, но они могут применяться на нескольких других языках.
Важно знать, что Карринг не называется функцией, но преобразует ее. По сути, это превращает это fn (param1, param2, param3)
в это fn (param1) (param2) (param3)
.
Очень часто узнавать там Карринг Определения и примеры, которые на самом деле относятся к приложение частичной функции . Если вы, как и я, заинтересованы в Функциональное программирование но (все еще) не эксперт в любом чисто функциональном языке, эти две концепции могут быть запутаны.
Частичное применение
На функциональных языках функции не «вызываются», а «применяются» к их аргументам. Они известны как «первоклассные граждане», что означает, что они могут быть назначены переменным и взаимодействовать с другими функциями, используемыми в качестве параметров или даже возвращаемых ими.
Функция частично применяется, когда он применяется только к части его параметров и возвращает другую функцию, которая ожидает других.
Например:
function sum(num1, num2, num3) { return num1 + num2 + num3 } // It can be invoked in two different ways sum(1, 2, 3) // 6 sum.appply(null, [1, 2, 3]) // 6
Теперь давайте создадим функцию, которая применяется сумма
Частично, что означает, что он исправляет первый параметр и возвращает функцию, которая ожидает двух других.
function partialSum(num1) { return function(num2, num3) { return sum(num1, num2, num3) } } // Using it const sumTwo = partialSum(2) sumTwo(3, 4) // 9
Эта операция может быть даже обобщена на любую функцию:
function partial(fn) { const args = Array.prototype.slice.call(arguments, 1) return function() { return fn.apply(null, args.concat(Array.prototype.slice.call(arguments, 0))) } } // Using it const sumTwo = partial(sum, 2) sumTwo(3, 4) // 9
Карри
Согласно Карринг Наиболее точное определение (как упоминалось в начале этой статьи):
«Карриинг» – это метод преобразования функции, которая приводит несколько аргументов в последовательность функций, каждый из которых принимает один аргумент
Обратите внимание, что приведенный выше пример не соответствует требованиям определения, потому что Частичный (сумма, 2)
Возвращает функцию, которая занимается два аргументы вместо одного. Если наша функция сделала Карринг , это должно быть названо таким, чтобы получить такой же конечный результат:
const sumTwo = curry(soma, 2) sumTwo(3)(4) // 9
Его полезность спорят не только в JavaScript, но и на других языках. Есть некоторые оправданные варианты использования, но некоторые просто нет. Карринг очень полезен, когда функции всегда не являются, что означает, что они принимают только один аргумент.
Примеры
Достаточно разговоров, давайте посмотрим на некоторые реальные примеры карри :
Обратите внимание, что эти примеры – просто объяснить немного лучше, как реализовать карри, если они полезны или нет, здесь не обсуждаются
Представьте, что у вас есть функция, ответственная за ведение управления в вашем приложении. Ваши журналы могут иметь 3 параметра, и вы хотели бы закрепить его, чтобы они стали более гибкими.
const logFn = (timestamp, type, message) => console.log(`[${date.getHours()}:${date.getMinutes()}] [${type}] ${message}`)
Чтобы привести функцию выше, мы могли бы реализовать нашу собственную Карринг функционируйте или воспользуйтесь любой библиотекой, которая делает это для нас. В этом случае мы собираемся использовать функциональный пакет программирования Lodash. Это делает тяжелую работу для нас и экономит нам время. (Если вы хотите попробовать свою собственную реализацию карри, проверьте этот кусок кода)
Корринг нашей функции журнала:
const { curry } from 'lodash/fp' const log = curry(logfn)
После этого мы можем называть нашу функцию нормально:
const timestamp = new Date() const type = 'WARNING' const message = 'Some warning' log(timestamp, type, message)
Но мы также можем назвать это в форме карри:
const timestamp = new Date( const type = 'WARNING' const message = 'Some warning' log(time)(type)(message)
И мы можем легко сделать удобную функцию для текущих журналов:
const logNow = log(new Date().getTime()) // Usage logNow('INFO', 'Message') // [HH:mm] INFO Message
Другое распространенное использование для карри функций – это когда вы справляетесь с цепными функциями, как при использовании труба Например, от Лодаша. Но это что -то для другой статьи:)
Вывод
Керрипинку немного сложно понять с первого взгляда, но если вы тренируете его каждый день, вы поймете это и, что самое важное, поймете, когда использовать его, потому что, в конце концов, это то, что действительно важно: зная, какая техника должна применяться к каждому сценарию.
Надеюсь, вам понравилось. Комментарий и поделитесь!
П.С.: Не стесняйтесь исправить меня, если я ошибаюсь в какой -то момент. Керрики все еще немного нового для меня:)
Оригинал: “https://dev.to/vcpablo/js-demystifying-currying-glh”