@ms-config

Почему в первом случае код не работает?

function addAll(a,b,c) {
  return a + b + c;
}
function divide10(x) {
  return x / 10;
}
function normalize(x) {
  return x * 5;
}

function composeWithArgs ( ...fns ) {
  return function(...args) {
    return fns.reduceRight( (f, g) => (() => g(f(...args)))());
  }
}

composeWithArgs(normallize,divide10,addAll)(50,50,50);  // f is not function

// А эта функция работает правильно
function composeWithArgs ( ...fns ) {
    return fns.reduceRight( (f, g) => (...args) => g(f(...args)));
}

composeWithArgs(normallize,divide10,addAll)(50,50,50); // 75
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
XanXanXan
@XanXanXan
.reduceRight( (f, g) => (() => g(f(...args)))())
Здесь на первой итерации возвращается divide10(addAll(50, 50, 50)), что равно 15, а это число. На следующую итерацию оно переходит в виде аккумулятора f. При попытке вызвать число f как f() и возникает ошибка, что это не функция.

.reduceRight( (f, g) => (...args) => g(f(...args)))
А здесь возвращается функция, соответственно она и переходит на следующую итерацию виде аккумулятора f.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы