1. 函子的概念: 函子(representative functor)是范畴论里的概念,指从任意范畴到集合范畴的一种特殊函子。 我们没有办法避免副作用,但是我们 尽可能的将副作用控制在可控的范围内,我们可以通过函子去处理副作用,我们也可以通过函子去处理异常,异步操作等。
      • 容器:包含值和值的变形关系(这个变形关系就是函数)
      • 函子:是一个特殊的容器,通过一个普通的对象来实现,该对象具有 map 方法,map方法可以运行一个函数对值进行处理(变形关系)
      • 函数式编程的运算不直接操作值,而是由函子完成
      • 函子就是一个实现了 map 契约的对象
      • 我们可以把函子想象成一个盒子,这个盒子里封装了一个值
      • 想要处理盒子中的值,我们需要给盒子的 map 方法传递一个处理值的函数(纯函数),由这个函数来对值进行处理
      • 最终 map 方法返回一个包含新值的盒子(函子)
      • 函数式编程指北
      • 函数式编程入门
      • Pointfree 编程风格指南
      • 图解 Monad
      • Functors, Applicatives, And Monads In Pictures
    2. 示例: ```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 }

    1. 上面一个代码块还是面向对象的编程思想, 要改成函数式编程的思想要避免使用new
    2. ```javascript
    3. class Container {
    4. //使用类的静态方法,of替代了new Container的作用
    5. static of (value) {
    6. return new Container(value)
    7. }
    8. constructor (value) {
    9. this._value = value
    10. }
    11. map (fn) {
    12. return Container.of(fn(this._value))
    13. }
    14. }
    15. const r = Container.of(5)
    16. .map(x=>x+2) // 7
    17. .map(x=> x**2) // 49
    18. console.log(r) // Container { _value: 49 }