• Home
  • About
    • 知易行难 photo

      知易行难

      front-end developer

    • Learn More
    • Email
    • Github
    • Weibo
  • Posts
    • All Posts
    • All Tags
  • Projects

curry函数的实现

10 May 2017

Reading time ~1 minute

最近遇到一道题:用js实现一个sum使得sum(2,3),和sum(2)(3)都能得到同样的结果。 我在网上找了下实现的方法,叫做curry Function.

下面是实现的代码:

var sum = function(a) {
    var arg = arguments;
    if (arg[1]) {
        return arg[0] + arg[1];
    } else {
        return function(b) {
            return a + b;
        };
    }
};
sum(2,3);
sum(2)(3);

别人写的代码如下:

function add(a, b) {
    if (arguments.length < 1) {
        return add;
    } else if (arguments.length < 2) {
        return function(c) { return a + c }
    } else {
        return a + b;
    }
}

什么是curry(柯里化)?

curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

栗子:

var curryIt = function(uncurried) {
  var parameters = Array.prototype.slice.call(arguments, 1);
  return function() {
    return uncurried.apply(this, parameters.concat(
      Array.prototype.slice.call(arguments, 0)
    ));
  };
};

参考

https://www.sitepoint.com/currying-in-functional-javascript/ http://www.crockford.com/javascript/www_svendtofte_com/code/curried_javascript/index.html https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch4.html#总结



curry Function函数的柯里化 Share Tweet +1