Рекурсивный вызов карри функции в Javascript - PullRequest
0 голосов
/ 09 марта 2019

В качестве игрушечного примера допустим, что у нас есть эта функция и ее использование:

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 и без передачи функции самой себе?Можно ли сделать это в стиле без очков?

1 Ответ

2 голосов
/ 09 марта 2019

Если я правильно понимаю ваш вопрос, вы не можете вернуть именованные функции стрелок, но вы можете вернуть именованную обычную функцию и вызвать ее рекурсивно следующим образом:

const reducer = k => function recurse(a, item) {
//...
    const s_res = _.split(item, k, 1);
    return recurse(a.withMutations(a => {
        a.push(s_res[0]);
        let a_element = document.createElement('a');
        a_element.setAttribute('href', '#');
        a_element.addEventListener('click', () => display_gen_element(k, obj));
        a.push(a_element);
    }), s_res[1]);
};

PS Длядля удобства чтения, пожалуйста, не используйте однобуквенные имена переменных, если не видно, для чего они предназначены, например, счетчик в цикле for и т. д.

...