函子
函子是函数式编程最重要的数据类型,也是基本的运算单位和功能单位。下面是一张经典的图例:
函子的代码实现:
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)