zoukankan      html  css  js  c++  java
  • 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函数式编程指南

  • 相关阅读:
    日报10.11
    日报10.9
    日报10.8
    日报10.7
    换马甲啦
    CSP2019知识点整理
    字符logo存档
    QHDYZ模拟赛20191027 提前透题
    数竞大佬jhc的三角函数复习题
    IO流
  • 原文地址:https://www.cnblogs.com/zjf-1992/p/6591190.html
Copyright © 2011-2022 走看看