24. Functor(函子)
leezozz 1/27/2023 js
# Functor(函子)
到目前为止已经学历了函数式编程的一些基础,但是我们还没有演示在函数式编程中如何把副作用控制在可控的范围内、异常处理、异步操作等
# 什么是Functor
- 容器:包含值和值的变形关系(这个变形关系就是函数)
- 函子:是一个特殊的容器,通过一个普通的对象来实现,该对象具有map方法,map方法可以运行一个函数对值进行处理(变形关系)
// // 首先函子是一个容器也是一个对象,那么我们创建容器对象
// class Container {
// // 函子内部有一个值,通过构造器来接收这个值(value)
// constructor(value) {
// // 将这个值存储起来
// // 这个值是函子内部去维护的,只有函子自己知道,不对外公布
// // 以下划线开始的值是私有的值
// this._value = value
// }
// // 函子具有一个对外的map方法,这个map函数是处理value值的方法,是一个纯函数
// // map方法是通过接收一个函数来处理value值的,所以接收一个函数(fn)
// map(fn) {
// return new Container(fn(this._value))
// }
// }
// let r = new Container(5)
// .map(val => val + 1)
// .map(val => val * val)
// console.log('r', r) // Container { _value: 36 }
class Container {
// 此处我们使用static来创建一个静态方法
static of(value) {
return new Container(value)
}
constructor(value) {
this._value = value
}
map(fn) {
// 那此处我们也可以直接使用of
return Container.of(fn(this._value))
}
}
// // 创建函子对象
let r = Container.of(5)
.map(val => val + 2)
.map(val => val * val)
console.log('r', r) // Container { _value: 36 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42