Это не отличный пример для обучения карри. Я думаю, что преподаватель / курс пытается донести до нас то, что когда вы делаете:
let result = calculate(add, subtract, multiply)(1,3)
вы вызываете функцию (calculate
), которая возвращает функцию (одну из трех, которую вы передаете, я думаю, выбрал случайным образом, хотя назначение неясно), а затем вы вызываете эту функцию (используя (1,3)
о результате вызова calculate(...)
.
calculate
может быть однострочным:
function calculate(...fns) {
return fns[Math.floor(Math.random() * fns.length)];
}
или в ES5:
function calculate() {
return arguments[Math.floor(Math.random() * arguments.length)];
}
Live Пример:
function add(num1, num2){
return num1 + num2;
}
function subtract(num1, num2){
return num1 - num2;
}
function multiply(num1, num2){
return num1 * num2;
}
function calculate(...fns) {
return fns[Math.floor(Math.random() * fns.length)];
}
let result = calculate(add, subtract, multiply)(1,3);
console.log(result);
Более полезным примером для обучения карри будет:
let result = calculate(add, subtract, multiply)(1)(3);
// ----------------------------------------------^^
Обратите внимание, что мы вызываем результат calculate
с 1
, затем вызываем результат , что с 3
. Затем calculate
нужно будет обернуть функцию, которую он выбирает, в другую функцию, которая собирает 1
и затем ожидает вызова с 3
:
function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => {
return (b) => {
return fn(a, b);
};
};
}
или более кратко, но менее четко:
function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => (b) => fn(a, b);
}
Live Пример:
function add(num1, num2){
return num1 + num2;
}
function subtract(num1, num2){
return num1 - num2;
}
function multiply(num1, num2){
return num1 * num2;
}
function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => (b) => fn(a, b);
}
let result = calculate(add, subtract, multiply)(1)(3);
console.log(result);
Функция, возвращаемая calculate
, при вызове запоминает a
и возвращает новую функцию; эта функция при вызове получает b
и вызывает fn(a, b)
для получения результата.
В этом примере функция выбирается заранее, но она может быть выбрана и в конце:
function calculate(...fns) {
return (a) => (b) => fns[Math.floor(Math.random() * fns.length)](a, b);
}
Live Пример:
function add(num1, num2){
return num1 + num2;
}
function subtract(num1, num2){
return num1 - num2;
}
function multiply(num1, num2){
return num1 * num2;
}
function calculate(...fns) {
return (a) => (b) => fns[Math.floor(Math.random() * fns.length)](a, b);
}
let result = calculate(add, subtract, multiply)(1)(3);
console.log(result);