Есть ли способ "обернуть" рекурсивную функцию через функцию более высокого порядка, чтобы рекурсивный вызов также был обернут? (например, для регистрации аргументов функции для каждого вызова.)
Например, предположим, что у нас есть функция sum()
, которая возвращает сумму списка чисел, добавляя голову к сумме хвоста:
function sum(a) {
if (a.length === 0) {
return 0;
} else {
return a[0] + sum(a.slice(1));
}
}
Есть ли способ написать функцию более высокого порядка, logging()
, которая принимает функцию sum()
как входную и возвращает функцию, которая выводит аргументы на sum()
для каждого рекурсивного вызова?
Не работает следующее:
function logging(fn) {
return function(a) {
console.log(a);
return fn(a);
}
}
sum2 = logging(sum);
sum2([1, 2, 3]);
Фактический выход:
[1, 2, 3]
-> 6
Ожидаемый результат:
[1, 2, 3]
[2, 3]
[3]
[]
-> 6
Возможно ли это, если sum()
переписано так, что его можно использовать с Y Combinator -стильной "рекурсией"?
function sum_core(g) {
return function (a) {
if (a.length === 0) {
return 0;
} else {
return a[0] + g(a.slice(1));
}
};
}
sum = Y(sum_core);
sum([1, 2, 3]);
// -> 6