Каррінг (каррінг) в javascript, блог веб-розробників

Каррінг (каррінг) в javascript, блог веб-розробників

Ні, термін «каррінг» ніяк не пов'язаний зі знаменитою приправою і взагалі не має ніякого відношення до східної кухні. Це прийом у функціональному програмуванні, що дозволяє перетворити функцію, замінивши її кілька перших аргументів константними значеннями, тим самим створивши нову функцію з меншою кількістю аргументів на основі старої. Цей буде зручно застосовувати в разі, коли перші кілька аргументів функції заздалегідь відомі, і вказувати їх при кожному виклику немає необхідності. Для стислості будемо називати перетворювати функцію карріруемой, а функцію, яка її перетворює, каррірующей.

Часто під каррінг розуміють заміну на константне значення лише одного аргументу карріруемой функції. Я пропоную же розглянути більш загальний випадок, коли замінних аргументів карріруемой функції кілька.

Реалізація

Для реалізації механізму каррінг нам необхідно написати каррірующую функцію, яка приймає в якості аргументів карріруемую функцію і значення, на які необхідно замінити перші аргументи карріруемой функції.

Давайте спочатку розглянемо більш простий варіант, коли карріруемая функція і кількість аргументів, від яких потрібно позбутися, відомо заздалегідь. Як карріруемой функції, для прикладу, візьмемо щось просте, наприклад, функцію, складаються два числа:

Після того, як ця функція буде схильна до каррінг з заміною одного аргументу на деяке значення, можна буде отримати функцію, яка, наприклад: інкрементує (збільшують на одиницю), декрементируется (зменшують на одиницю) або додають до свого вже єдиному аргументу задане заздалегідь значення.

Робиться це відносно просто:

Якщо передавати карріруемую функцію з відомою кількістю аргументів як аргумент каррірующей, але як і раніше залишити кількість замінних аргументів карріруемой функції заданим, то завдання ускладнитися ненабагато.

Розглянемо ще одну просту функцію:

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 і не буде приймати ніяких параметрів.

На цьому все, що я можу вам розповісти про каррінг. Як завжди, бажаю вам успіхів!

Невже не можна було взяти слово «Перетворююча»?

Ви ідіот. Слово «каррінг» пішло від імені Каррі Хаскель. При чому тут «перетворення»?

Схожі статті