认识函子
为什么要学习函子
为了函数式编程中把副作用控制在可控范围内、做异常处理、异步操作等。
什么是Functor?
- 容器:包含值和值变形关系(这个变形关系就是函数)
- 函子:是一个特殊的容器,通过一个普通的对象来实现,该对象有map方法,map方法执行一个函数对值进行处理(变形关系)
functor
//一个容器包裹一个值class Container {constructor(value) {this._value = value;}map(fn) {return new Container(fn(this._value))}}const r = new Container(3).map(x => x + 1).map(x => x * x)console.log(r);//用static of 静态方法 不用每次都向上次一样new 关键字创建对象class Container{// of 静态方法 可以省略 new 关键字创建对象static of (value) {return new Container(value);}//构造函数constructor(value) {this,_value = value;}// map 方法, 传入变形关系, 将容器里的每个值映射到另一个容器map(fn) {// 这里又新建了函子,然后把函子中的值进行了处理作为新函子的值return Container.of(fn(this._value));}}//测试let r = Container.of(3).map(x => x + 2).map(x => x * x)console.log(r)//打印出来的r不是一个值 是一个函子对象
函子总结:
- 函数式编程的运算不直接赋值,而是由函子完成。
- 函子就是一个实现了 map 契约的对象
- 我们可以把函子想象成一个盒子,这个盒子里封装了一个值,
- 想要处理盒子中的值吗,我们需要给盒子的 map 方法传递一个处理值的函数(纯函数),由这个函数来对值进行处理
- 最终 map 方法 返回一个包含新值的盒子(函子)
