WhiteBachelor
@WhiteBachelor
Начинающий веб-программист.

Два набора параметров в одной функции? Или функция, возвращающая другую функцию? Как этим вообще пользоваться?

Наткнулся на codewars.com на следующую задачу:
Нужно спроектировать функцию высшего порядка так, чтобы она извлекала другие функции из массива и выполняла их по цепочке. Причем, вводное значение задается... как-же это называется-то... скажем, на втором уровне или порядке. То есть: chained([f1,f2,f3])(0).

Вот оригинал:

Your task is to write a higher order function for chaining together a list of unary functions. In other words, it should return a function that does a left fold on the given functions.

chained([a,b,c,d])(input)
Should yield the same result as

d(c(b(a(input))))

Сперва я впал в полный ступор, вообще не было понятно что бы это могло значить, но потом вспомнил главу о функциях высшего порядка в учебнике "Выразительный JavaScript" и приступил к реализации по памяти. На практике ранее такую запутанную функцию не реализовывал:

function chained(functions) {

  return function(input){
    console.log(input);
    var param = input;
    for (i = functions.length - 1; i >= 0; i--){
      let making = functions[i];
      param = making(param);
    }
  }

}

На что получил такой ответ:

Expected: 4, instead got: undefined

Ээээ... в смысле? Понятно, что полученный тип данных не соответствовал требуемому или индекс был задан неправильно. Но почему?
Раньше не реализовывал функции настолько высшего порядка. То, что я делал было гораздо проще, и самое сложное что я писал - это генератор чисел Фибоначчи и рекурсивные аналоги forEach'а, map'а и filter'а.
  • Вопрос задан
  • 202 просмотра
Решения вопроса 2
@StockholmSyndrome
почему вы начинаете перебирать с конца массива?
function chained(functions) {
  return function(input) {
    for (let i = 0; i < functions.length; i++) {
      input = functions[i](input);
    }
    return input;    
  }
}

а ещё вы return забыли, поэтому и undefined
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
const chained = functions => initialArg => functions.reduce((arg, f) => f(arg), initialArg);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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