这节开始讲的例子都使用简单的TS来写,尽量做到和es6差别不大,正文如下

我们在编程中必然需要用到一些变量存储数据,供今后其他地方调用。而函数式编程有一个要领就是最好不要依赖外部变量(当然允许通过参数传递咯),如何解决这个矛盾的问题呢?将函数柯里化`Curry`就可以了,这种技巧可以让函数记住一些历史数据,也就是缓存,怎么做呢?

说柯里化之前必须先说一下闭包,因为这是实现柯里化的方法。

## 闭包

const fun = () => {
let a = 0;
return () => {
a += 1;
return a;
};
};
const fa = fun();
console.log(fa()); // 1
console.log(fa()); // 2
console.log(fa()); // 3

每次运行这个函数居然结果不一样,why?因为`a`是`fun`函数内部变量,而这个变量又被`fun`返回的函数依赖,`fun()`执行后,fa所指向的那个函数(`fun`的返回值)还在依赖着`a`。根据js的垃圾回收机制,只要`fa`存在,那么`a`就不会被释放,一直在内存中。

进一步想,既然a作为局部变量被依赖着就一直存在,那么这个局部变量要是参数是不是也有同样的效果呢,答案是肯定的。

```javascript
const fun = (a: number) => {
return () => {
a += 1;
return a;
};
};
const fa = fun(1);
console.log(fa()); // 2
console.log(fa()); // 3
console.log(fa()); // 4
```

好,闭包就讲这么多。回到柯里化。

## 柯里化

柯里化由函数闭包实现。我们把上面的例子改一改

```javascript
const fun = (a: number) => (b: number) => {
return a + b
};
const add2 = fun(2);
console.log(add2(2)); // 4
console.log(add2(3)); // 5
console.log(add2(4)); // 6
```

`fun(2)`就是`(b) => b+2`,所以`add2(2)`自然是`4`。以上就是柯里化,参数可以先后传入,全部传完才计算。以上是es6或ts的代码实现,比较简陋。事实上你完全不必要自己去实现一个函数的柯里化。可以使用成熟的库如ramda。ramda库还包含了很多已经柯里化的函数。

```javascript
import { curry } from 'ramda'
const fun = curry((a: number, b: number) => {
return a + b
});
const add2 = fun(2);
console.log(add2(2)); // 4
console.log(add2(3)); // 5
console.log(add2(4)); // 6
```

把一个你要柯里化的函数,原封不动的给curry函数,返回的就是柯里化的函数。但要注意函数参数从左往右的顺序是依次传给柯里化后函数的顺序。have fun!

js函数式编程(二)-柯里化的更多相关文章

  1. 函数式编程之柯里化(curry)

    函数式编程curry的概念: 只传递给函数一部分参数来调用函数,然后返回一个函数去处理剩下的参数. var add = function(x) { return function(y) { retur ...

  2. JS中的反柯里化( uncurrying)

    反柯里化 相反,反柯里化的作用在与扩大函数的适用性,使本来作为特定对象所拥有的功能的函数可以被任意对象所用.即把如下给定的函数签名, obj.func(arg1, arg2) 转化成一个函数形式,签名 ...

  3. JS 浅谈函数柯里化,不明觉厉

    在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 Christopher ...

  4. js bind es5函数柯里化

    绑定函数 bind()最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值.常见的错误就像上面的例子一样,将方法从对象中拿出来,然后调用,并且希望this指向原来的对象. 如果不做特 ...

  5. js链式调用 柯里化

    var d = 1; d.add(2).add(3).add(4) //输出10 写出这个add函数 Number.prototype.add = function(x){ return this + ...

  6. JavaScript函数的柯里化(currying)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...

  7. 简单粗暴详细讲解javascript实现函数柯里化与反柯里化

    函数柯里化(黑人问号脸)???Currying(黑人问号脸)???妥妥的中式翻译既视感:下面来一起看看究竟什么是函数柯里化: 维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第 ...

  8. JavaScript ES6函数式编程(二):柯里化、偏应用和组合、管道

    上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心.这一篇来看看高阶函数的实战场景. 首先强调两点: 注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量 高阶函数思想:以变量作用域作为根 ...

  9. Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化

    承接上文:Java函数式编程:一.函数式接口,lambda表达式和方法引用 这次来聊聊函数式编程中其他的几个比较重要的概念和技术,从而使得我们能更深刻的掌握Java中的函数式编程. 本篇博客主要聊聊以 ...

随机推荐

  1. CodeForces - 1004A-Sonya and Hotels(思维)

    Sonya decided that having her own hotel business is the best way of earning money because she can pr ...

  2. MS SqlServer之Exec和EXEC SP_EXECUTESQL

    exec执行sql时字符串时,不能给变量赋值,如果要在sql里给变量赋值,请用EXEC SP_EXECUTESQL 示例: 通过 SP_EXECUTESQL 的第2个参数来定义有哪些参数 输出的加OU ...

  3. PHP函数生成随机数

    通常情况下,当我们要生成一个随机字符串时,总是先创建一个字符池,然后用一个循环和mt_rand()或rand()生成php随机数,从字符池中随机选取字符,最后拼凑出需要的长度,代码如下: <?p ...

  4. c#基础_ArrayList

    list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); //list.AddRange(list); //list.Clear();清空所有元素 ...

  5. c#基础 base和this的区别,在继承上面

    base public Person(string name, int age, char gender) { this.Name = name; this.Age = age; this.Gende ...

  6. 轻量级的绘制图表js库--Morris.js

    Morris.js 是一个轻量级的 JS 库,使用 jQuery 和 Raphaël 来生成各种时序图. 虽说现在移动手机网络已经到了4G,但是在移动web客户端开发过中,为了达到良好的体验效果,需要 ...

  7. 使用 Kendo UI 库实现对象的继承

    使用 Kendo UI 库实现对象的继承 javaScript 也是一种面向对象的开发语言,但和 C++,Java,C# 所不同的是,它的对象不是基于类(Class),而是基于对象原型(ProtoTy ...

  8. Swift 扩展(Extension)总结

    概要 扩展是给已经存在的类(class),结构体(structure),枚举类型(enumeration)和协议(protocol)增加新的功能.类似Objective-C中的Category,不同的 ...

  9. ArcSDE 10.1 For Windows 创建空间数据库与常见错误_SQL Server

    本文是2013年时候参加ESRI竞赛,创建ArcSDE 10.1 for SQL Server时候出问题了,因此写了该文档. 由于一直忙于学习,忘了发布.今天一师弟也遇到同样问题,为此我觉得可能有不少 ...

  10. db2数据库备份

    一.离线备份 db2  list  database  directory -----查看有哪些数据库,确定需要备份哪个数据库 db2  disconnect  current -----断开以数据库 ...