В качестве игрушечного примера допустим, что у нас есть эта функция и ее использование:
const map = (f = n => n + 1) => (lst = [1,2,3]) => {
if(lst.length === 0)
return [];
else
return [f(...lst.splice(0,1)), ...map(f)(lst)];
}
const inc = n => n + 1;
const map_inc = map(inc);
map_inc([1,2,3]) // => (produces) [2,3,4]
Внутри карты функций карри я использую "рекурсию", вызывая map(f)(lst)
.
В приведенном выше примере функция перестраивается до ее вызова.
Возможно ли выполнить эту рекурсию без перестройки функции?
Я знаю об этом:
y = (f = (f, ...args) => [...args],
...args) => f(f, ...args);
const map = (mapper = n => n + 1) => (self = mapper, lst = [1,2,3]) => {
if(lst.length === 0)
return [];
else
return [mapper(...lst.splice(0,1)), ...self(self, lst)];
}
const inc = n => n + 1;
const map_inc = (...args) => y(map(inc), ...args);
map_inc([1,2,3]) // => (produces) [2,3,4]
Мне не очень нравится, как для этого требуется передача функции самой себе.
Может ли это быть сделано без функции y
и без передачи функции самой себе?Можно ли сделать это в стиле без очков?