javascript之典型高阶函数应用介绍二


Posted in Javascript onJanuary 10, 2013

前言
在前一篇文章javascript之典型高阶函数中主要实现了几个典型的functional函数。文章最后也提出了疑问,为啥那样的实现与F#之类的函数式语言“不太一样”呢?今天来试试更“函数式”的实现。

另一种实现
同样地,尝试对之前实现的函数做一些改动,把for循环去掉。如何去掉呢?这里先要引入一个集合的归纳法定义:

一个集合要么是空集,要么是一个数与一个集合组成的数对从定义可以看到,每一个集合都可以看作为一个数和一个集合的对。例如:{1,2,4,5} 可以认为是数 1 与 集合{2,4,5} 组成的一对,写成(1 , {2,4,5})。递归地,{2,4,5} 可以看成是(2 , {4,5})。最后即为 (5 , Ø)。按照这样的理解,我们就可以用递归的方法消除循环,因为我们在分解的时候已经访问了每一个数据项,并且终结条件为空集。下面就看一下filter函数的另一个实现,原函数名加前缀f以区别之前函数:

function ffilter(arr,callback){ 
var i=arguments[2] || 0, 
  out = arguments[3] || []; 
if(!arr[i]) return arguments[3]; 
if(callback(arr[i])) 
out.push(arr[i]); 
return arguments.callee(arr,callback,++i,out); 
}

测试:
var arr = [1,2,3,4,5,6,7,8,9,10]; 
var even = function(item){ 
if(typeof item !== "number") return false; 
return !(item & 1); 
}; 
console.log(ffilter(arr,even));

结果:
[2, 4, 6, 8, 10] 这样消除循环之后,更贴近于数学的归纳定义,显得更自然。同样地,再看一下ffold函数:
var arr = [1,2,3,4,5,6,7,8,9,10]; 
var plus = function(a,b){ 
return a+b; 
}; 
console.log(ffold(arr,plus,3));

结果:
58
其他函数以同样的方法即可。这样就感觉更functional 了,但能不能再与数学定义更加接近呢?下一次再尝试。
==========2013.1.8 更新==================
上面说到了那些写法能否与数学定义更加接近,下面就尝试一下使用链表。先给出一个定义:
var node = function(){ 
this.data = 0; 
this.tail = null; 
};

再初始化一个链表
var n1 = new node(),n2 = new node(),n3 = new node(),n4 = new node(),n5 = new node(); 
n1.data=1,n1.tail=n2; 
n2.data=2,n2.tail=n3; 
n3.data=3,n3.tail=n4; 
n4.data=4,n4.tail=n5; 
n5.data=5,n5.tail=null;

fold链表版本:
function lfold(head,callback,b){ 
if(!head) return b; 
else return callback(head.data,arguments.callee(head.tail,callback,b)); 
}

输出结果:
18
按照之前的定义,一个集合要么是空集,要么是一个“头”与一个“尾”(集合)组成的数对。每一次调用函数时,分解为head和tail,直到集合为空(写完上面的lfold函数真心感觉太完美了,简直就是定义,要是程序都长这样,注释都不需要了,真是一种享受)。这样子算是最接近数学定义的表示了。因为javascript不支持很多函数式语言的match,所以不能“自动”分解,也就不能直接表示归纳定义。

javascript除了以上的一些东西,还可以实现函数式里面的partial,dojo框架里面的hitch就做到了这一功能,这也是函数式贴近数学的另外一个明显的例子。我将在下一篇博客中讨论。

Javascript 相关文章推荐
jquery中ajax学习笔记一
Oct 16 Javascript
JS正则表达式大全(整理详细且实用)
Nov 14 Javascript
利用了jquery的ajax实现二级联互动菜单
Dec 02 Javascript
JS操作HTML自定义属性的方法
Feb 10 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
浅谈jQuery中height与width
Jul 06 Javascript
AngularJS+Node.js实现在线聊天室
Aug 28 Javascript
bootstrap daterangepicker汉化以及扩展功能
Jun 15 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
Mar 05 Javascript
vue使用原生swiper代码实例
Feb 05 Javascript
jquery插件懒加载的示例
Oct 24 jQuery
js实现纯前端压缩图片
Nov 16 Javascript
javascript之典型高阶函数应用介绍
Jan 10 #Javascript
根据json字符串生成Html的一种方式
Jan 09 #Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
Jan 09 #Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 #Javascript
实现web打印的各种方法介绍及实现代码
Jan 09 #Javascript
js去除重复字符串两种实现方法
Jan 09 #Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
Jan 09 #Javascript
You might like
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
Python压缩和解压缩zip文件
2015/02/14 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
利用Python破解验证码实例详解
2016/12/08 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
PyQt5 多窗口连接实例
2019/06/19 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
应届大学生自荐书
2014/06/17 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
外出学习心得体会范文
2016/01/18 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android
mysql数据库如何转移到oracle
2022/12/24 MySQL