函数式编程之一柯里化

Posted tiboo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程之一柯里化相关的知识,希望对你有一定的参考价值。

什么是柯里化?

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数的函数

 

下面来看一个案例,两值相加:

柯里化之前(常见用法)

function add(x, y) {
    return x + y
}
add(1, 2)

柯里化之后

function add(x) {
    return function(y) {
        return x + y
    }
}
add(1)(2)

从上面两个例子中似乎好像对柯里化有点感觉了,嗯,再想想

 

学习新概念时最怕的就是自己理解错了,这样的体验简直无比糟糕,so我们再来看一个案例

function multi(a) {
    return function(b) {
        return function(c) {
            return a * b * c;
        }
    }
}
multi(1)(2)(3)

按着对柯里化的理解,我写了这个案例,转念一想,这也是柯里化么? 那么多个return看着有点瘆人,难道是我理解错了么,还是方式用错了,好吧,继续挖掘

 

然后找了一个关于柯里化的面试题

实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6
add(1, 2, 3)(4) = 10
add(1)(2)(3)(4)(5) = 15

 

实现方案:

var addFn = function () {
  var _args = [];
  return function () {
    if (arguments.length === 0) {
      return _args.reduce(function (a, b) {
        return a + b;
      });
    };
    [].push.apply(_args, [].slice.call(arguments));
    return arguments.callee;
  }
};    
var sum = addFn();
sum(1,2,3)(4);  
console.log(sum());   // 10 

--> [].slice.call(arguments)通过arguments得到一个数组

--> [].push.apply(_args, [].slice.call(arguments))将数组Push到_args里面

--> 再次调用时通过闭包保存了上一次返回的值

--> sum()最后运行时,arguments.length === 0,通过reduce方法求和

 

 从例子中我们可以发现:sum(1,2,3)(4)通过闭包的方式保存了得到的值,不是每次都参与计算得到结果,而是在最后通过sum()才实现求和

以此能看出它的一个特点:延迟计算

 

en....貌似要是面试遇到这种题也能写出个答案来了,但是了目前为止我还是无法学以致用,不明白这种函数适用于什么场景

 

以上是关于函数式编程之一柯里化的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程———柯里化(Currying)

函数式编程-函数的合成与柯里化

函数式编程之柯里化

JavaScript函数式编程(纯函数柯里化以及组合函数)

前端学习之函数式编程—柯里化

js函数式编程-柯里化