在 Javascript 中递归调用柯里化函数
Recursively calling a curried function in Javascript
举个例子,假设我们有这个函数及其用法:
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)
.
使用 "recursion"
上面的例子在函数被调用之前重建了函数。
是否可以在不重建函数的情况下进行递归?
我知道这种方式:
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
函数并且不将函数传递给自身,是否可以做到这一点?这可以用更无积分的方式完成吗?
如果我对你的问题的理解正确,你不能return命名箭头函数,但你可以return命名常规函数并像这样递归调用它:
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]);
};
P.S。为了可读性,请不要使用一个字母的变量名,除非它们的用途非常明显,例如for
循环中的计数器等
如果您的目的是消除将 self 传递给自身的需要
...self(self, lst)
您可以通过添加另外 1 个名为 recursor
的函数来完成此操作
const map = (mapper = n => n + 1) => (lst = [1, 2, 3]) => {
const recursor = lst => {
if (lst.length === 0) return [];
else return [mapper(...lst.splice(0, 1)), ...recursor(lst)];
};
return recursor(lst);
};
const inc = n => n + 1;
const map_inc = map(inc);
console.log(map_inc([1, 2, 3])); // => (produces) [2,3,4]
您根本不需要名为 y
的类似 y 组合器的函数。
recursor
在其闭包中有 mapper
举个例子,假设我们有这个函数及其用法:
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
函数并且不将函数传递给自身,是否可以做到这一点?这可以用更无积分的方式完成吗?
如果我对你的问题的理解正确,你不能return命名箭头函数,但你可以return命名常规函数并像这样递归调用它:
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]);
};
P.S。为了可读性,请不要使用一个字母的变量名,除非它们的用途非常明显,例如for
循环中的计数器等
如果您的目的是消除将 self 传递给自身的需要
...self(self, lst)
您可以通过添加另外 1 个名为 recursor
const map = (mapper = n => n + 1) => (lst = [1, 2, 3]) => {
const recursor = lst => {
if (lst.length === 0) return [];
else return [mapper(...lst.splice(0, 1)), ...recursor(lst)];
};
return recursor(lst);
};
const inc = n => n + 1;
const map_inc = map(inc);
console.log(map_inc([1, 2, 3])); // => (produces) [2,3,4]
您根本不需要名为 y
的类似 y 组合器的函数。
recursor
在其闭包中有 mapper