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对象数据缓存Cache原理以及jQuery.data详解
Apr 07 Javascript
js实现的四级左侧网站分类菜单实例
May 06 Javascript
jquery动态导航插件dynamicNav用法实例分析
Sep 06 Javascript
JQuery标签页效果实例详解
Dec 24 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
Apr 03 Javascript
vue2.0实战之基础入门(1)
Mar 27 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
Jul 13 jQuery
表格展示利器 Bootstrap Table实例代码
Sep 06 Javascript
Vue自定义弹窗指令的实现代码
Aug 13 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 Javascript
JS判断数组四种实现方法详解
Jun 29 Javascript
html5 录制mp3音频支持采样率和比特率设置
Jul 15 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 str_pad 函数使用详解
2009/01/13 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
19个Android常用工具类汇总
2014/12/30 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
jquery中:input和input的区别分析
2011/07/13 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
node内置调试方法总结
2018/02/22 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
Python制作exe文件简单流程
2019/01/24 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
经典导游欢迎词大全
2014/01/16 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
群众路线专项整治方案
2014/10/27 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server