含义:
- 函子是一个容器,始终维护内部的一个值,且不会对外公布这个值
- 对外会提供一个map方法,该方法接收一个处理内部值的回调函数,调用map方法最终返回一个新函子
- 每个函子具有链式调用,每当调用一个map,会生成一个新的函子
```javascript
/**
- 函子:
- 函子是一个容器,会始终维护内部里的值,且这个值不会对外公布,
- 会对外提供一个map方法,该方法接受一个用于处理容器内部值的方法,最终调用map方法返回一个函子
- 函子可以存在多种,并不是唯一的,由于暴露出map方法,该方法返回的一个函子,所以map接受不同的处理值的函数,就会产生不同的函子
- 每个函子具有循环链式调用,可以反复调用map,因此在不同map中处理容器里的值,非常灵活
- map始终会返回新的函子 */
// 函子 // class Container { // constructor(values) { // // this._value: 容器的值 // this._values = values; // } // // fn: 维护值的方法 // map(fn) { // // 返回一个函子 // return new Container(fn(this._values)) // } // } // const box = new Container(10).map(v => v + 1).map(v => v * v) // console.log(box) // Container {_value: 121}
class Container { static of (values) { return new Container(values) } constructor(values) { this._values = values; } map(fn) { return Container.of(fn(this._values)); } } const box = Container.of(10).map(v => v + 1).map(v => v * v); console.log(box) // Container {_value: 121}
当创建函子时,如果传递是值是null或者undefined时,会发生什么?
```javascript
class Container {
static of (values) {
return new Container(values)
}
constructor(values) {
this._values = values;
}
map(fn) {
return Container.of(fn(this._values));
}
}
// 演示创建函子时传递null或者uundefined
Container.of(null).map(x=> x.toUpperCase()) // error:Cannot read property 'toUpperCase' of null
总结:
- 函数式编程的运算不会直接操作值,而是由函子来完成
- 函子是一个具有map契约的对象
- 函子对外抛出的方法是处理内部值的唯一途径
- 调用map会生成新的函子,具有链式调用的特性
- 无法处理传递空值时初始化函子的报错