JavaScript函数式编程

    一段糟糕透顶的海鸥seagulls程序  

鸟群合并conjoin则变成了一个更大的鸟群,繁殖breed则增加了鸟群的数量,增加的数量就是它们繁殖出来的海鸥的数量

//Flock 群
var Flock = function(n){
    //海鸥seagulls
    this.seagulls = n;
}
//结队conjoin
Flock.prototype.conjoin = function(other) {
    this.seagulls += other.seagulls;
    return this;
};
//繁殖breed
Flock.prototype.breed = function(other) {
    this.seagulls = this.seagulls * other.seagulls;
    return this;
};
 
var flock_a = new Flock(4); //{ seagulls : 4 }
var flock_b = new Flock(2); //{ seagulls : 2 }
var flock_c = new Flock(0); //{ seagulls : 0 }
 
//注意flock_a a群鸟在结对繁殖的过程中不断变化
var result = flock_a.conjoin(flock_c).breed(flock_b).conjoin(flock_a.breed(flock_b)).seagulls; 
//运行结果 ==>>32 而不是16

    函数式写法对海鸥seagulls程序改写  

//鸟群结队conjoin
var conjoin = function(flock_x, flock_y){
    return flock_x + flock_y;
}
//鸟群繁殖breed
var breed = function(flock_x, flock_y){
    return flock_x * flock_y;
}
//鸟群a
var flock_a = 4;
//鸟群b
var flock_b = 2;
//鸟群c
var flock_c = 0;
var result = conjoin(breed(conjoin(flock_a,flock_c),flock_b), breed(flock_a, flock_b));
console.log(result); //==>16

缺点:函数嵌套conjoin(breed(conjoin(flock_a,flock_c),flock_b), breed(flock_a, flock_b))既长又TMD臭,一眼看不出什么东东来!!!

但仔细一看,函数"conjoin""breed"方法无非做了“加法”“乘法”的运算,将“加法”修改为“add”,“乘法”修改为multiply于是有如下代码

//鸟群结队conjoin
var add = function(x, y){
    return x + y;
}
//鸟群繁殖breed ['mʌltɪplaɪ] 
var multiply = function(x, y){
    return x * y;
}
//鸟群a
var flock_a = 4;
//鸟群b
var flock_b = 2;
//鸟群c
var flock_c = 0;
var result = add(multiply(add(flock_a,flock_c),flock_b), multiply(flock_a, flock_b));
console.log(result); //==>16

 在改之前,看一些经典数学公式

// 结合律(assosiative)
add(add(x, y), z) == add(x, add(y, z));

// 交换律(commutative)
add(x, y) == add(y, x);

// 同一律(identity)
add(x, 0) == x;

// 分配律(distributive)
multiply(x, add(y,z)) == add(multiply(x, y), multiply(x, z));

应用上述公式简化海鸥程序

//原始代码
add(multiply(add(flock_a,flock_c),flock_b), multiply(flock_a, flock_b));
//应用同一律 add(flock_a,flock_c)  ==>> flock_a
add(multiply(flock_a,flock_b), multiply(flock_a, flock_b));//(a*b)+(a*b)   

// 分配律(distributive (a*b)+(a*b) <<==>> b* (a+a)
multiply(flock_b, add(flock_a, flock_a))  

于是最终代码就很nice了

//鸟群结队conjoin
var add = function(x, y){
    return x+ y;
}
//鸟群繁殖breed ['mʌltɪplaɪ] 
var multiply = function(x, y){
    return x* y;
}
//鸟群a
var flock_a = 4;
//鸟群b
var flock_b = 2;
//鸟群c
var flock_c = 0;
var result = multiply(flock_a, add(flock_b, flock_b));
console.log(result); //==>16

作者:Avenstar

出处:http://www.cnblogs.com/zjf-1992/p/6591190.html

关于作者:专注于前端开发、喜欢阅读

本文版权归作者所有,转载请标明原文链接

资料来源

JS函数式编程指南

原文地址:https://www.cnblogs.com/zjf-1992/p/6591190.html