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 相关文章推荐
通过JS 获取Mouse Position(鼠标坐标)的代码
Sep 21 Javascript
19个很有用的 JavaScript库推荐
Jun 27 Javascript
JS组件Bootstrap Table使用实例分享
May 30 Javascript
分享Bootstrap简单表格、表单、登录页面
Aug 04 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
Aug 14 jQuery
基于Vue.js 2.0实现百度搜索框效果
Dec 28 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
Sep 03 jQuery
Bootstrap栅格系统的使用详解
Oct 30 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 Javascript
js字符串倒序的实例代码
Nov 30 Javascript
vue写h5页面的方法总结
Feb 12 Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 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递归列出所有文件和目录的代码
2008/09/10 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
js中function()使用方法
2013/12/24 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python中查看文件名和文件路径
2017/03/31 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
如何用Python制作微信好友个性签名词云图
2019/06/28 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
企业诚信承诺书
2014/05/23 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
关于观后感的作文
2015/06/18 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
React四级菜单的实现
2022/04/08 Javascript
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers