认识函子
    为什么要学习函子
    为了函数式编程中把副作用控制在可控范围内、做异常处理、异步操作等。

    什么是Functor?

    • 容器:包含值和值变形关系(这个变形关系就是函数)
    • 函子:是一个特殊的容器,通过一个普通的对象来实现,该对象有map方法,map方法执行一个函数对值进行处理(变形关系)

    functor

    1. //一个容器包裹一个值
    2. class Container {
    3. constructor(value) {
    4. this._value = value;
    5. }
    6. map(fn) {
    7. return new Container(fn(this._value))
    8. }
    9. }
    10. const r = new Container(3)
    11. .map(x => x + 1)
    12. .map(x => x * x)
    13. console.log(r);
    14. //用static of 静态方法 不用每次都向上次一样new 关键字创建对象
    15. class Container{
    16. // of 静态方法 可以省略 new 关键字创建对象
    17. static of (value) {
    18. return new Container(value);
    19. }
    20. //构造函数
    21. constructor(value) {
    22. this,_value = value;
    23. }
    24. // map 方法, 传入变形关系, 将容器里的每个值映射到另一个容器
    25. map(fn) {
    26. // 这里又新建了函子,然后把函子中的值进行了处理作为新函子的值
    27. return Container.of(fn(this._value));
    28. }
    29. }
    30. //测试
    31. let r = Container.of(3)
    32. .map(x => x + 2)
    33. .map(x => x * x)
    34. console.log(r)
    35. //打印出来的r不是一个值 是一个函子对象

    函子总结:

    • 函数式编程的运算不直接赋值,而是由函子完成。
    • 函子就是一个实现了 map 契约的对象
    • 我们可以把函子想象成一个盒子,这个盒子里封装了一个值,
    • 想要处理盒子中的值吗,我们需要给盒子的 map 方法传递一个处理值的函数(纯函数),由这个函数来对值进行处理
    • 最终 map 方法 返回一个包含新值的盒子(函子)