一、什么是函子
函子:一个特殊的容器,通过一个普通的对象来实现,该对象具有 map 方法,map 方法可以运
行一个函数对值进行处理(变形关系)
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))
}
}
// 测试
Container.of(3)
.map(x => x + 2)
.map(x => x * x)
函数式编程的运算不直接操作值,而是由函子完成
函子就是一个实现了 map 契约的对象
我们可以把函子想象成一个盒子,这个盒子里封装了一个值
想要处理盒子中的值,我们需要给盒子的 map 方法传递一个处理值的函数(纯函数),由这
个函数来对值进行处理
最终 map 方法返回一个包含新值的盒子(函子)
二、MayBe 函子
我们在编程的过程中可能会遇到很多错误,需要对这些错误做相应的处理
MayBe 函子的作用就是可以对外部的空值情况做处理(控制副作用在允许的范围)
class MayBe {
static of (value) {
return new MayBe(value)
}
constructor (value) {
this._value = value
}
// 如果对空值变形的话直接返回 值为 null 的函子
map (fn) {
return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value))
}
isNothing () {
return this._value === null || this._value === undefined
}
}
// 传入具体值
MayBe.of('Hello World')
.map(x => x.toUpperCase())
// 传入 null 的情况
MayBe.of(null)
.map(x => x.toUpperCase())
// => MayBe { _value: null }
三、Either 函子
Either 两者中的任何一个,类似于 if...else...的处理
异常会让函数变的不纯,Either 函子可以用来做异常处理