JavaScript currying模式:调用函数时出错

时间:2018-10-17 22:51:18

标签: javascript

我正在尝试在我的简单程序中实现求和乘法的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

2 个答案:

答案 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)