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 相关文章推荐
slice函数的用法 之不错的应用
Dec 29 Javascript
JS替换字符串中空格方法
Apr 17 Javascript
浅谈JavaScript中的Math.atan()方法的使用
Jun 14 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
May 12 Javascript
js拼接html字符串的注意事项
Oct 13 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
Nov 15 Javascript
基于Swiper实现移动端页面图片轮播效果
Dec 28 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
Nov 20 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
Nov 14 Javascript
阿望教你用vue写扫雷小游戏
Jan 20 Javascript
react中props 的使用及进行限制的方法
Apr 28 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
基于mysql的论坛(5)
2006/10/09 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
Python双向循环链表实现方法分析
2018/07/30 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
python空元组在all中返回结果详解
2020/12/15 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
汽车专业毕业生推荐信
2013/11/12 职场文书
加拿大探亲邀请信
2014/01/28 职场文书
《寓言两则》教学反思
2014/02/27 职场文书
前台接待岗位职责
2015/02/03 职场文书
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript