如何执行一个功能,无论它是正常的还是携带的,并产生相同的结果?
How to execute one function whether it normal or carried and yield the same result?
multiply
函数的主体是什么,如果以下面的两种方式执行会得到相同的结果。所以调用 multiply(2,4)
或 multiply(2)(4)
会输出 8?
您可以检查是否传递了第二个参数。
function multiply(a,b){
if(b === undefined){
return function(b){
return a * b;
}
}
return a * b
}
console.log(multiply(2,4))
console.log(multiply(2)(4))
相当简单 - 检查第二个参数是否存在,并相应地修改 return 值:
const multiply = (a, b) => b ? a * b : c => a * c;
console.log(multiply(2, 3));
console.log(multiply(2)(4));
这也可以相当简单地扩展为采用三个参数:
const multiply = (a, b, c) => c ? a * b * c : (b ? (d => a * b * d) : (d, e) => a ? d * e : f => d * f);
console.log(multiply(2, 3, 4));
console.log(multiply(2, 5)(3));
console.log(multiply(2)(6, 3));
只要你有一个柯里化函数,你就需要一些方法来结束柯里化,就像你需要一个递归的基本情况一样。结束条件可以是
(1) 参数个数,例如2 在这种情况下:
const curry = (fn, n) => {
const c = (...args) => (...args2) => args.length + args.length >= n ? fn(...args, ...args2) : c(...args, ...args2);
return c();
};
const add = curry((a, b) => a + b, 2);
(1b) 当然也可以从函数签名中导出:
const curry = (fn, ...keep) => (...args) => keep.length + args.length >= fn.length ? fn(...keep, ...args) : curry(fn, ...keep, ...args);
const add = curry((a, b) => a + b);
(2) 最后一个空函数调用,例如add(1, 2)()
或 add(1)(2)()
const curry = fn => (...args) => (...args2) => args2.length ? curry(fn)(...args, ...args2) : fn(...args, ...args2);
const add = curry((a, b) => a + b);
(3) 最后进行一些类型转换,以触发要计算的结果,例如+add(1, 2)
或 +add(1)(2)
:
const curry = (fn, ...keep) => {
const c = (...args) => curry(fn, ...keep, ...args);
c.valueOf = () => fn(...keep);
return c;
};
const add = curry((a, b) => a + b);
const multiply = (a,b) => !b ? (b) => a * b : a * b;
console.log(multiply(2, 4))
console.log(multiply(2)(4))
multiply
函数的主体是什么,如果以下面的两种方式执行会得到相同的结果。所以调用 multiply(2,4)
或 multiply(2)(4)
会输出 8?
您可以检查是否传递了第二个参数。
function multiply(a,b){
if(b === undefined){
return function(b){
return a * b;
}
}
return a * b
}
console.log(multiply(2,4))
console.log(multiply(2)(4))
相当简单 - 检查第二个参数是否存在,并相应地修改 return 值:
const multiply = (a, b) => b ? a * b : c => a * c;
console.log(multiply(2, 3));
console.log(multiply(2)(4));
这也可以相当简单地扩展为采用三个参数:
const multiply = (a, b, c) => c ? a * b * c : (b ? (d => a * b * d) : (d, e) => a ? d * e : f => d * f);
console.log(multiply(2, 3, 4));
console.log(multiply(2, 5)(3));
console.log(multiply(2)(6, 3));
只要你有一个柯里化函数,你就需要一些方法来结束柯里化,就像你需要一个递归的基本情况一样。结束条件可以是
(1) 参数个数,例如2 在这种情况下:
const curry = (fn, n) => {
const c = (...args) => (...args2) => args.length + args.length >= n ? fn(...args, ...args2) : c(...args, ...args2);
return c();
};
const add = curry((a, b) => a + b, 2);
(1b) 当然也可以从函数签名中导出:
const curry = (fn, ...keep) => (...args) => keep.length + args.length >= fn.length ? fn(...keep, ...args) : curry(fn, ...keep, ...args);
const add = curry((a, b) => a + b);
(2) 最后一个空函数调用,例如add(1, 2)()
或 add(1)(2)()
const curry = fn => (...args) => (...args2) => args2.length ? curry(fn)(...args, ...args2) : fn(...args, ...args2);
const add = curry((a, b) => a + b);
(3) 最后进行一些类型转换,以触发要计算的结果,例如+add(1, 2)
或 +add(1)(2)
:
const curry = (fn, ...keep) => {
const c = (...args) => curry(fn, ...keep, ...args);
c.valueOf = () => fn(...keep);
return c;
};
const add = curry((a, b) => a + b);
const multiply = (a,b) => !b ? (b) => a * b : a * b;
console.log(multiply(2, 4))
console.log(multiply(2)(4))