一段糟糕透顶的海鸥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. CoreJava(一)—— Java迭代语句

    本文介绍一些关于迭代语句的一些相关技巧以及Java8中的迭代语句的使用方法. public class TestBreak { public static void main(String[] arg ...

  2. ife 零基础学院 day 1 - 我为什么想学前端

    与前端结缘   我是后端研发,毕业四年,用了四年C#,一开始写ASP.NET,有时会在asp页面写简单的js和html,做点css样式调整.当时的感触是前端调试太费劲了,因为没有js.html.css ...

  3. [转]简单科普私钥、地址、助记词、Keystore的区别

    本文转自:https://www.jianshu.com/p/d0a4a44685d3 很多人保管不好自己的虚拟财产,发生丢币的情况,很多都是因为不清楚私钥的概念. 私钥(Private Key) 比 ...

  4. [转]Illuminate Database

    本文转自:https://github.com/illuminate/database Illuminate Database The Illuminate Database component is ...

  5. sqlserver 操作数据表语句模板

    从网上搜的,一点一点加吧. -----------设置事务全部回滚----------------- SET XACT_ABORT ON BEGIN BEGIN TRY BEGIN TRANSACTI ...

  6. SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一.在JAVA开发领域,目前可以通过以下 ...

  7. trivial and nontrivial

    Trivial A solution or example that is ridiculously simple and of little interest. Often, solutions o ...

  8. 整理:手机端弹出提示框,使用的bootstrap中的模态框(modal,弹出层),比kendo弹出效果好

    效果图: 我的代码示例: <!--提示模态框--> <div class="modal fade" id="myModal" tabindex ...

  9. blfs(systemd版本)学习笔记-为桌面环境构建xorg服务

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs准备使用桌面环境,首先需要构建xorg服务 xorg服务项目地址:http://www.linuxfromscratch. ...

  10. windows for windows:下载、安装

    关于docker的下载:同学们不要再网上找来找去了,直接去到阿里云下载客户端,配置阿里的国内镜像地址就好~ 申请一个阿里云的账号,然后: tips:如果使用虚拟机的os 是windows 那么很抱歉, ...