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
资料来源
JavaScript函数式编程的更多相关文章
- 转:JavaScript函数式编程(三)
转:JavaScript函数式编程(三) 作者: Stark伟 这是完结篇了. 在第二篇文章里,我们介绍了 Maybe.Either.IO 等几种常见的 Functor,或许很多看完第二篇文章的人都会 ...
- 转: JavaScript函数式编程(二)
转: JavaScript函数式编程(二) 作者: Stark伟 上一篇文章里我们提到了纯函数的概念,所谓的纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环 ...
- 转:JavaScript函数式编程(一)
转:JavaScript函数式编程(一) 一.引言 说到函数式编程,大家可能第一印象都是学院派的那些晦涩难懂的代码,充满了一大堆抽象的不知所云的符号,似乎只有大学里的计算机教授才会使用这些东西.在曾经 ...
- JavaScript 函数式编程读书笔记2
概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...
- JavaScript 函数式编程读书笔记1
概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...
- 一文带你了解JavaScript函数式编程
摘要: 函数式编程入门. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函 ...
- javascript函数式编程和链式优化
1.函数式编程理解 函数式编程可以理解为,以函数作为主要载体的编程方式,用函数去拆解.抽象一般的表达式 与命令式相比,这样做的好处在哪?主要有以下几点: (1)语义更加清晰 (2)可复用性更高 (3) ...
- JavaScript函数式编程(纯函数、柯里化以及组合函数)
JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...
- javascript 函数式编程
编程范式 编程范式是一个由思考问题以及实现问题愿景的工具组成的框架.很多现代语言都是聚范式(或者说多重范式): 他们支持很多不同的编程范式,比如面向对象,元程序设计,泛函,面向过程,等等. 函数式编程 ...
- 在JavaScript函数式编程里使用Map和Reduce方法
所有人都谈论道workflows支持ECMAScript6里出现的令人吃惊的新特性,因此我们很容易忘掉ECMAScript5带给我们一些很棒的工具方法来支持在JavaScript里进行函数编程,这些工 ...
随机推荐
- CoreJava(一)—— Java迭代语句
本文介绍一些关于迭代语句的一些相关技巧以及Java8中的迭代语句的使用方法. public class TestBreak { public static void main(String[] arg ...
- ife 零基础学院 day 1 - 我为什么想学前端
与前端结缘 我是后端研发,毕业四年,用了四年C#,一开始写ASP.NET,有时会在asp页面写简单的js和html,做点css样式调整.当时的感触是前端调试太费劲了,因为没有js.html.css ...
- [转]简单科普私钥、地址、助记词、Keystore的区别
本文转自:https://www.jianshu.com/p/d0a4a44685d3 很多人保管不好自己的虚拟财产,发生丢币的情况,很多都是因为不清楚私钥的概念. 私钥(Private Key) 比 ...
- [转]Illuminate Database
本文转自:https://github.com/illuminate/database Illuminate Database The Illuminate Database component is ...
- sqlserver 操作数据表语句模板
从网上搜的,一点一点加吧. -----------设置事务全部回滚----------------- SET XACT_ABORT ON BEGIN BEGIN TRY BEGIN TRANSACTI ...
- SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一.在JAVA开发领域,目前可以通过以下 ...
- trivial and nontrivial
Trivial A solution or example that is ridiculously simple and of little interest. Often, solutions o ...
- 整理:手机端弹出提示框,使用的bootstrap中的模态框(modal,弹出层),比kendo弹出效果好
效果图: 我的代码示例: <!--提示模态框--> <div class="modal fade" id="myModal" tabindex ...
- blfs(systemd版本)学习笔记-为桌面环境构建xorg服务
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs准备使用桌面环境,首先需要构建xorg服务 xorg服务项目地址:http://www.linuxfromscratch. ...
- windows for windows:下载、安装
关于docker的下载:同学们不要再网上找来找去了,直接去到阿里云下载客户端,配置阿里的国内镜像地址就好~ 申请一个阿里云的账号,然后: tips:如果使用虚拟机的os 是windows 那么很抱歉, ...