一段糟糕透顶的海鸥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函数式编程指南

JavaScript函数式编程的更多相关文章

  1. 转:JavaScript函数式编程(三)

    转:JavaScript函数式编程(三) 作者: Stark伟 这是完结篇了. 在第二篇文章里,我们介绍了 Maybe.Either.IO 等几种常见的 Functor,或许很多看完第二篇文章的人都会 ...

  2. 转: JavaScript函数式编程(二)

    转: JavaScript函数式编程(二) 作者: Stark伟 上一篇文章里我们提到了纯函数的概念,所谓的纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环 ...

  3. 转:JavaScript函数式编程(一)

    转:JavaScript函数式编程(一) 一.引言 说到函数式编程,大家可能第一印象都是学院派的那些晦涩难懂的代码,充满了一大堆抽象的不知所云的符号,似乎只有大学里的计算机教授才会使用这些东西.在曾经 ...

  4. JavaScript 函数式编程读书笔记2

    概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...

  5. JavaScript 函数式编程读书笔记1

    概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...

  6. 一文带你了解JavaScript函数式编程

    摘要: 函数式编程入门. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函 ...

  7. javascript函数式编程和链式优化

    1.函数式编程理解 函数式编程可以理解为,以函数作为主要载体的编程方式,用函数去拆解.抽象一般的表达式 与命令式相比,这样做的好处在哪?主要有以下几点: (1)语义更加清晰 (2)可复用性更高 (3) ...

  8. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...

  9. javascript 函数式编程

    编程范式 编程范式是一个由思考问题以及实现问题愿景的工具组成的框架.很多现代语言都是聚范式(或者说多重范式): 他们支持很多不同的编程范式,比如面向对象,元程序设计,泛函,面向过程,等等. 函数式编程 ...

  10. 在JavaScript函数式编程里使用Map和Reduce方法

    所有人都谈论道workflows支持ECMAScript6里出现的令人吃惊的新特性,因此我们很容易忘掉ECMAScript5带给我们一些很棒的工具方法来支持在JavaScript里进行函数编程,这些工 ...

随机推荐

  1. c++选择重载函数

    一.函数重载 普通函数重载的关键是参数列表---也称函数特征标.函数参数中有以下情况可以出现重载: 1.  形参个数不同 2.  形参的类型不同 3.  形参的类型和个数都不同 const形参和函数重 ...

  2. Java虚拟机——类的结构与加载

    1.为什么Java可以跨平台 因为有java虚拟机,跨平台是因为字节码即class文件具有平台无关性,java代码会经过java虚拟机转换为字节码 2.class文件的结构 class文件主要是以8位 ...

  3. TypeScript学习之WebStorm(1)

    修改快捷键 本没有想要修改快捷键,调试的时候下意识的 按F10,发现还是习惯使用visual studio的快捷键.WebStorm支持修改快捷键,File=>Settings=>Keym ...

  4. fiddle使用小结

    1:保存发出的请求:右键Save,找到selected Sessions 选择 in ArchiveZip 2:更改header 重新发送请求:右键 Unlock For Editing 然后修改He ...

  5. https创建请求UrL报错: 未能为 SSL/TLS 安全通道建立信任关系

    1.项目中异常报错如下: 2.百度结果:原来是 网站没有使用SSL证书或者是SSl证书失效了的缘故. 3.具体解决方案如下: )导入命名空间 using System.Net.Security; us ...

  6. C#中saveFileDialog(另存为)保存图片文件

    弹出另存为提示框保存图片文件: //用户自由选择指定路径保存文件            SaveFileDialog savedialog = new SaveFileDialog();        ...

  7. nginx配置反向代理和负载均衡

    一.反向代理 说明:应该有一个nginx服务器有多个应用服务器(可以是tomcat),本文使用一台虚拟机,安装一个nginx,多个tomcat,来模拟 upstream tomcats{ server ...

  8. java回调函数学习

    前不久学习了代理模式,其中有一个核心之一是Proxy.newProxyInstance();这里有三个参数, loader:目标对象的类加载器 interfaces:目标对象实现的所有接口组成的数组 ...

  9. 百度前端学院-基础学院-第20到21天之setTimeOut与setInterval

    setTimeout()可以使用clearTimeout()关闭 setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭. 注意:setInterv ...

  10. mapper代理查询

    对于查询来说,要根据具体的业务,来指定mapper接口中方法的返回值类型1:如果只返回一条记录,mapper接口中方法的返回值类型应指定为pojo类型或其他简单类型,这样mybatis内部就会使用se ...