看到一篇非常不错的文章,这里分享给大家:http://www.jianshu.com/p/fa3568087881

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

我们从最简单的栗子开始:

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?

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

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

addTen(5);    // 15

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

add(10)(5);   //15

  我们再稍微深入理解一下:

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的操作,我们再改进下这个函数:

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操作,再一次改进:

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呢,这个方法就做不到,我们就再一次改进看看:

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啦,欢迎各位留言,提反馈!

Function Programming - 柯里化(curry)的更多相关文章

  1. Scala 基础(十二):Scala 函数式编程(四)高级(二)参数(类型)推断、闭包(closure)、函数柯里化(curry)、控制抽象

    1  参数(类型)推断 参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以 ...

  2. 函数柯里化 curry

    一.函数柯里化的特性: (1)参数复用 $.ajax // 示例一 function ajax(type,url,data) { var xhr = new XMLHttpRequest(); xhr ...

  3. Javascript函数柯里化(curry)

    函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...

  4. JS 柯里化 (curry)

    用 JS 理解柯里化 函数式编程风格,试图以函数作为参数传递(回调)和无副作用的返回函数(修改程序的状态). 很多语言采用了这种编程风格.JavaScript,Haskell,Clojure,Erla ...

  5. JavaScript函数柯里化的一些思考

    1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...

  6. js函数式编程(二)-柯里化

    这节开始讲的例子都使用简单的TS来写,尽量做到和es6差别不大,正文如下 我们在编程中必然需要用到一些变量存储数据,供今后其他地方调用.而函数式编程有一个要领就是最好不要依赖外部变量(当然允许通过参数 ...

  7. 前端进击的巨人(五):学会函数柯里化(curry)

    柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...

  8. curry柯里化函数实现

    curry柯里化函数实现 参考文章: 一行写出javascript函数式编程中的curry 感谢作者分享 第一步: 缓存原始函数的参数个数 function curry(fn) { var limit ...

  9. Scala函数柯里化(Currying or Curry)

    柯里化(Currying) 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 简单的实现如下: scala> def ...

随机推荐

  1. 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结

    前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...

  2. Linux.根据进程名关键字杀进程

    先看例子, 假设系统中有以下2个进程 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND root     ...

  3. Hibernate 一对一双向映射 注解方式

    有外键的一方: @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "courseid") public Tcourse ge ...

  4. LeetCode 628. Maximum Product of Three Numbers (最大三数乘积)

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  5. LeetCode 289. Game of Life (生命游戏)

    According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellul ...

  6. JavaScript--我发现,原来你是这样的JS(再说引用类型,基本包装类型与个体内置对象)

    一.介绍 本篇是续上一篇的,引用类型的后篇,本篇主要是说基本包装类型和个体内置对象.如果你能收获一些知识,那我很高兴,很满足,哈哈哈,希望大家能愉快看完.如果你想学好一门技术,要不忘初心,方得始终. ...

  7. sessionStorage,UserDataStorage,cookie全兼容写法存在的问题

    最近央视播出了中国诗词大赛,看到了一首诗,送给大家 <春宵·春宵一刻值千金> 作者:苏轼 [宋代] 春宵一刻值千金,花有清香月有阴. 歌管楼台声细细,秋千院落夜沉沉. 好了,言归正传,今天 ...

  8. 前端的UI设计与交互之色彩篇

    一.颜色Red热情.警示 Green成功.通过.安全 Blue专业.科技 Pink典雅.明快.女性 Orange醒目.温暖 Purple高雅.浪漫 Yellow活力.提示 Cyan清新.冷静.结构化 ...

  9. http 500错误怎么解决方法

    出现500错误的原因是很多的,一般来说,如果程序出错,那么在浏览器内会返回给用户一个友好的错误提示,统一称之为服务器500错误. 解决的方法就是您必须在http中能够正确的获得错误信息,方法为:请打开 ...

  10. addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】

    yuanwen http://www.jb51.net/article/32511.htm 写 addEventListener 和 attachEvent 区别的博文不少,不过大部分都把重点放置于前 ...