函数式编程(二)

268 阅读1分钟

函子

函子是函数式编程最重要的数据类型,也是基本的运算单位和功能单位。下面是一张经典的图例:

函子
函子是一种范畴也就是一个容器,包含值和变形关系
函子的代码实现:

class Functor {
  constructor(val) { 
    this.val = val; 
  }

  map(f) {
    return new Functor(f(this.val));//任何具有map方法的数据结构,都可以当作函子的实现。
  }
}

of方法,为了让函数式编程看起来不那么面向对象,of会帮助我们new一个容器:

Functor.of= function(val) {
  return new Functor(val);
};
//那么我们可以这么写
Functor.of(2).map(function (val){
    return val*2
})//Functor(4)

我们发现Functor函子不具备值检查能力,传入错误的值会出现Error

Functor.of(null).map(function (s) {
  return s.toUpperCase();
});
// TypeError

为了避免这种情况我们引入了maybe函子:

class Maybe extends Functor {
  map(f) {
    return this.val ? Maybe.of(f(this.val)) : Maybe.of(null);
  }
}
//解决ERROR的问题
Maybe.of(null).map(function (s) {
  return s.toUpperCase();
})//Maybe.of(null)

函子里面包含的值,完全可能是函数。我们可以想象这样一种情况,一个函子的值是数值,另一个函子的值是函数,A的值放进B中计算

function addTwo(x) {
  return x + 2;
}

const A = Functor.of(2);
const B = Functor.of(addTwo)

我们需要ap函子来帮我们完成

class Ap extends Functor {
  ap(F) {
    return Ap.of(this.val(F.val));
  }
}
Ap.of(addTwo).ap(Functor.of(2))//返回一个函子Ap(4)