![Каррінг (каррінг) в javascript, блог веб-розробників (javascript) Каррінг (каррінг) в javascript, блог веб-розробників](https://images-on-off.com/images/161/karrirovaniekarringvjavascriptblogvebraz-13f77fc2.jpg)
Ні, термін «каррінг» ніяк не пов'язаний зі знаменитою приправою і взагалі не має ніякого відношення до східної кухні. Це прийом у функціональному програмуванні, що дозволяє перетворити функцію, замінивши її кілька перших аргументів константними значеннями, тим самим створивши нову функцію з меншою кількістю аргументів на основі старої. Цей буде зручно застосовувати в разі, коли перші кілька аргументів функції заздалегідь відомі, і вказувати їх при кожному виклику немає необхідності. Для стислості будемо називати перетворювати функцію карріруемой, а функцію, яка її перетворює, каррірующей.
Часто під каррінг розуміють заміну на константне значення лише одного аргументу карріруемой функції. Я пропоную же розглянути більш загальний випадок, коли замінних аргументів карріруемой функції кілька.
Реалізація
Для реалізації механізму каррінг нам необхідно написати каррірующую функцію, яка приймає в якості аргументів карріруемую функцію і значення, на які необхідно замінити перші аргументи карріруемой функції.
Давайте спочатку розглянемо більш простий варіант, коли карріруемая функція і кількість аргументів, від яких потрібно позбутися, відомо заздалегідь. Як карріруемой функції, для прикладу, візьмемо щось просте, наприклад, функцію, складаються два числа:
Після того, як ця функція буде схильна до каррінг з заміною одного аргументу на деяке значення, можна буде отримати функцію, яка, наприклад: інкрементує (збільшують на одиницю), декрементируется (зменшують на одиницю) або додають до свого вже єдиному аргументу задане заздалегідь значення.
Робиться це відносно просто:
Якщо передавати карріруемую функцію з відомою кількістю аргументів як аргумент каррірующей, але як і раніше залишити кількість замінних аргументів карріруемой функції заданим, то завдання ускладнитися ненабагато.
Розглянемо ще одну просту функцію:
var sayHelloTo = curry (sayTwoWords, "Hello"); sayHelloTo ( "Bob"); sayHelloTo ( "Marry"); var sayGoodbyeTo = curry (sayTwoWords, "Goodbye"); sayGoodbyeTo ( "Bob"); sayGoodbyeTo ( "Marry"); var minusThree = curry (sum, -3); console.log (minusThree (13)); // 10
Тепер розглянемо більш складний варіант, коли карріруемая функція заздалегідь невідома і невідомо кількість аргументів, які необхідно замінити на константні значення.
В яку повертатимуть функції нам необхідно викликати карріруемую функцію, підставивши в якості перших аргументів значення з масиву curryArgs. а в якості інших - значення, передані в якості параметрів повертається функції. Для цього скористаємося нативним методом apply. який дозволяє викликати функцію зі значеннями аргументів, які передані йому в масиві. Цей масив метод apply приймає в якості другого параметра. В якості першого він приймає об'єкт, який буде повертатися при зверненні до this всередині функції. Перед тим, як викликати метод apply від карріруемой функції, перетворимо в масив об'єкт arguments повертається функції і склеим, за допомогою методу concat. масив curryArgs c отриманим масивом. Результат цієї операції і передамо в якості другого аргументу методу apply. У підсумку функція curry набуде вигляду:
Однак цей синтаксис довше і нам довелося вказувати другий аргумент карріруемой функції, що здається дрібницею, але все ж зайве. А тепер уявіть, що у карріруемой функції список аргументів достатньо довгий або він зовсім змінної довжини. І, хоча каррінг, працює повільніше, воно приваблює своєю стислістю і простотою використання.
Тепер розглянемо граничний випадок, коли у карріруемой функції всі аргументи замінюються константними значеннями.
var createMessageBox = curry (createElement, 'DIV',);
Функція createMessageBox створюватиме div c css-класом message-box і не буде приймати ніяких параметрів.
На цьому все, що я можу вам розповісти про каррінг. Як завжди, бажаю вам успіхів!
Невже не можна було взяти слово «Перетворююча»?
Ви ідіот. Слово «каррінг» пішло від імені Каррі Хаскель. При чому тут «перетворення»?