//函子的简单示例 class Functor{
    constructor(val){
    this.val = val
    }

    map(fn){
    return new Functor(fn(this.val))
    }
    }
    //测试示例
    const r = new Functor(5).map((val) => val + val).map((val) => val val)
    console.log(r) // 返回一个函子对象 Functor { val: 100 }

    //缺点 每次创建函子都要通过new关键字去创建,不太像函数式编程,因为new关键字是面向对象编程得标志

    class FunctorV2{
    static of(val){
    return new FunctorV2(val)
    }
    constructor(val) {
    this.val = val
    }
    map(fn){
    return FunctorV2.of(fn(this.val))
    }
    }
    const rv2 = FunctorV2.of(5).map((val) => val + val).map((val) => val
    val)
    console.log(rv2) // 返回一个函子对象 FunctorV2 { val: 100 }

    /
    总结:
    函子的本质是一个对象
    将函子比作一个特殊的容器,里面封装了一个值和处理值得map方法
    想要处理盒子中的值,我们需要给盒子的map方法传递一个处理函数(纯函数),由这个函数来对值进行处理
    纯函数:相同得输入始终得到相同得输出
    最终map方法返回一个包含新值的盒子(函子)
    /

    //Maybe函子 作用就是处理函子中值为null或undefined的异常
    class FunctorMaybe{
    static of(val){
    return new FunctorMaybe(val)
    }
    constructor(val){
    this.val = val
    }
    map(fn){
    return this.void() ? FunctorMaybe.of(null) : FunctorMaybe.of(this.val)
    }
    void(){
    return this.val === undefined || this.val === null
    }
    }
    //测试
    let rFunctorMaybe = FunctorMaybe.of(‘Hello World’)
    .map(x => x.toUpperCase())
    console.log(rFunctorMaybe) // => FunctorMaybe { val: ‘Hello World’ }

    // 测试:是空值时
    let rFunctorMaybev = FunctorMaybe.of(null)
    .map(x => x.toUpperCase())
    console.log(rFunctorMaybev) // => FunctorMaybe { val: null } //这里并不会报错,而是给一个null值