Function Programming - 柯里化(curry)

看到一篇很是不错的文章,这里分享给你们:http://www.jianshu.com/p/fa3568087881javascript

首先,柯里化的定义:你能够只透过部分的参数呼叫一个function,它会回传一个function 去处理剩下的参数。java

咱们从最简单的栗子开始:函数

var add  = function(a) {
  return function(b) {
    return a + b;
  }
}

var addTen = add(10);

addTen(5);    // 15

同时,咱们还能够这样调用:

add(10)(5);   //15

  上述add函数是柯里化以后的函数,通常咱们会以下定义add函数:工具

var add = function(a, b) {
  return a + b;
}

  通常的定义有什么问题呢,参数可能不当心多了,那多余的参数就会被忽略,也有可能传参传少了,那么函数执行会发生错误;而柯里化若是传部分参数只会返回要处理剩下参数的函数,make sense?blog

固然咱们有工具使咱们的函数柯里化,这里咱们举例用lodash的https://lodash.com/docs/4.17.4#curryip

var add = _.curry(function(a, b) {
  return a + b;
})

var addTen = add(10);

addTen(5);    // 15

同时,柯里化也接受传多个参数:

add(10)(5);   //15

  咱们再稍微深刻理解一下:get

var object = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}];
var getIds = object.map(o => (o.id));

  上述代码明显是取objec里面各个id;这有个什么问题呢?咱们没有办法重用getIds这个函数,由于每次想拿到id,都得进行一次map和取id的操做,咱们再改进下这个函数:it

var objects = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}];
var getId = (object) => (object.id);
var getIds = objects.map(getId);    //解释下为啥这里能够不用参数直接能够调用getId,由于fp(Function Programming)中函数是一等公民,function(a) {return getId(a);} 与 getId是等价的;

  这样的,咱们抽出去里getId这个函数,可是依然不能彻底重用,由于每次还要进行一次map操做,再一次改进:io

var objects = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}];
var getId = (object) => (object.id);
var getIds = _.curry((objects) => objects.map(getId));

getIds(objects);   //[1,2,3]

  这个时候咱们就用到里柯里化,可是依然不够好,由于若是我想拿到每一个object的name呢,这个方法就作不到,咱们就再一次改进看看:function

var objects = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}];

var getValues = _.curry((objects, key) => objects.map((object) => (object[key])));

getValues(objects, 'name')

 这样的话,咱们就能取任何key的值了,只须要传入objects和key便可。

var objects = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}];

var getId = _.curry((property, object) => (object[property]));
var map = _.curry((fn, objects) => objects.map(fn));
var getValues = map(getId('id')); getValues(objects); 因为咱们对key值进行的操做可能不同,因此咱们能够传一个函数;

  这就是咱们所介绍的curry啦,欢迎各位留言,提反馈!

相关文章
相关标签/搜索