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 相关文章推荐
JAVASCRIPT对象及属性
Feb 13 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
Aug 09 Javascript
js时间比较示例分享(日期比较)
Mar 05 Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 Javascript
js自定义瀑布流布局插件
May 16 Javascript
微信小程序自动客服功能
Nov 02 Javascript
JavaScript模块详解
Dec 18 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
Feb 14 Javascript
详解JS深拷贝与浅拷贝
Aug 04 Javascript
JS+CSS实现过渡特效
Jan 02 Javascript
JS不要再到处使用绝对等于运算符了
Apr 30 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的控制语句
2006/10/09 PHP
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
php不用正则采集速度探究总结
2008/03/24 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
轻松实现js弹框显示选项
2016/09/13 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
Python深入学习之上下文管理器
2014/08/31 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
Python中的pack和unpack的使用
2018/03/12 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
python flask中动态URL规则详解
2019/11/22 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
高中学生期末评语
2014/04/25 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
十岁生日答谢词
2015/01/05 职场文书
民事诉讼代理词
2015/05/25 职场文书
校运会广播稿
2015/08/19 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python