- 函子的概念: 函子(representative functor)是范畴论里的概念,指从任意范畴到集合范畴的一种特殊函子。 我们没有办法避免副作用,但是我们 尽可能的将副作用控制在可控的范围内,我们可以通过函子去处理副作用,我们也可以通过函子去处理异常,异步操作等。
- 容器:包含值和值的变形关系(这个变形关系就是函数)
- 函子:是一个特殊的容器,通过一个普通的对象来实现,该对象具有 map 方法,map方法可以运行一个函数对值进行处理(变形关系)
- 函数式编程的运算不直接操作值,而是由函子完成
- 函子就是一个实现了 map 契约的对象
- 我们可以把函子想象成一个盒子,这个盒子里封装了一个值
- 想要处理盒子中的值,我们需要给盒子的 map 方法传递一个处理值的函数(纯函数),由这个函数来对值进行处理
- 最终 map 方法返回一个包含新值的盒子(函子)
- 函数式编程指北
- 函数式编程入门
- Pointfree 编程风格指南
- 图解 Monad
- Functors, Applicatives, And Monads In Pictures
示例: ```javascript class Container { constructor (value) { // 这个函子的值是保存在内部的,不对外公布 // _下划线的成员都是私有成员,外部无法访问,值是初始化的传的参数 this._value = value }
//有一个对外的方法map,接收一个函数(纯函数),来处理这个值 map (fn) { // 返回一个新的函子,把fn处理的值返回给函子,由新的函子来保存 return new Container(fn(this._value)) } }
// 创建一个函子的对象 let r = new Container(5) .map(x => x + 1) // 6 .map(x => x ** 2) // 36
// 返回了一个container函子对象,里面有值是36,不对外公布 console.log(r) //Container { _value: 36 }
上面一个代码块还是面向对象的编程思想, 要改成函数式编程的思想要避免使用new
```javascript
class Container {
//使用类的静态方法,of替代了new Container的作用
static of (value) {
return new Container(value)
}
constructor (value) {
this._value = value
}
map (fn) {
return Container.of(fn(this._value))
}
}
const r = Container.of(5)
.map(x=>x+2) // 7
.map(x=> x**2) // 49
console.log(r) // Container { _value: 49 }