认识函子
为什么要学习函子
为了函数式编程中把副作用控制在可控范围内、做异常处理、异步操作等。
什么是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 方法 返回一个包含新值的盒子(函子)