//函子的简单示例
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值
