我正在尝试在我的简单程序中实现求和乘法的currying模式。为此,我定义了一个通用的curry函数,并在其中调用sum和乘法函数,但没有得到任何输出。谁能告诉我我的程序出了什么问题?预先感谢。
代码::
function curry(fn) {
sum.call(this, a,b);
multiply.call(this, a,b,c);
}
function sum(a, b) {
return a + b;
}
function multiply(a, b, c) {
return a * b * c;
}
const curriedSum = curry(sum);
const curriedMult = curry(multiply);
const addOne = curriedSum(1);
const addTwo = curriedSum(2);
预期输出::
// 1 + 3 = 4
console.log('result', addOne(3)); // 'result' 4
// 1 + 1 = 2
console.log('result', addOne(1)); // 'result' 2
// 2 + 5 = 7
console.log('result', addTwo(5)); // 'result' 7
// 2 * 3 * 4 = 24
console.log('result', curriedMult(2)(3)(4)); // 'result' 24
答案 0 :(得分:2)
我认为您应该退后一步,询问您希望curry
函数返回什么。使用它的方式表明您希望它返回一个函数,因此它至少需要 来执行。该函数看起来也应该带有参数,因为您使用的是这种方式。
所以…只要返回一个带有参数的函数,并将其绑定到您传递给curry
的函数中,然后返回即可。
const curry = (fn) => (...a) => fn.bind(null, ...a)
这表示curry
是一个接受函数参数(fn
)的函数,并返回一个接受参数并返回fn.bind
的结果的新函数的新函数>
要使用它,您可以:
const curry = (fn) => (...a) => fn.bind(null, ...a)
function sum(a, b) {
return a + b;
}
function multiply(a, b, c) {
return a * b * c;
}
const curriedSum = curry(sum);
const curriedMult = curry(multiply);
const addTwo = curriedSum(2);
console.log(addTwo(10)) // 2 + 10
const mult10 = curriedMult(10)
// because we spread the args in curry you
// can pass two arguments
console.log(mult10(10, 2)) // 10 * 10 * 2
// or you can even curry it again:
const mult20 = curriedMult(20)
const curriedMult20 = curry(mult20)
const mult20_10 = curriedMult20(10)
console.log(mult20_10(2)) // 20 * 10 * 2
答案 1 :(得分:2)
在您的curry函数上,问题是您不调用传递的fn, 您必须保持fn处于关闭状态,并返回等待第二个参数调用自身的新函数。
您可能想查看this关于Clousers的精彩文章;
这也是您的代码的有效示例;
const curry = (fn) => (...args) => fn(...args)
function sum(a, b) {
return a + b;
}
function multiply(a, b, c) {
return a * b * c;
}
const curriedSum = curry(sum);
const curriedMult = curry(multiply);
const addOne = curriedSum(1,2);
const addTwo = curriedSum(2,3);
const multiple = curriedMult(2,3,4)
console.log(addOne)
console.log(addTwo)
console.log(multiple)