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性能优化28条建议你值得借鉴
Feb 16 Javascript
jquery判断当前浏览器的实现代码
Nov 07 Javascript
AngularJS进行性能调优的7个建议
Dec 28 Javascript
快速掌握jQuery插件WebUploader文件上传
Nov 07 Javascript
解析jQueryEasyUI的使用
Nov 22 Javascript
基本DOM节点操作
Jan 17 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
Oct 26 Javascript
原生JS实现的自动轮播图功能详解
Dec 28 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
Nov 16 Javascript
Vue组件间数据传递的方式(3种)
Jul 13 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 Javascript
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
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
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
PHP实现简易blog的制作
2016/10/24 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
javascript与CSS复习(三)
2010/06/29 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
讲解Python中的标识运算符
2015/05/14 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
python中根据字符串调用函数的实现方法
2016/06/12 Python
使用python为mysql实现restful接口
2018/01/05 Python
基于pip install django失败时的解决方法
2018/06/12 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
详解python中的闭包
2020/09/07 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
总裁助理岗位职责
2014/02/17 职场文书
中药专业自荐信范文
2014/03/18 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
幼儿园大班教师评语
2019/06/21 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
Redis 常见使用场景
2021/08/30 Redis