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脚本的性能的几个注意事项
Dec 22 Javascript
JS写的数字拼图小游戏代码[学习参考]
Oct 29 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
javascript基本算法汇总
Mar 09 Javascript
jQuery中常用动画效果函数(日常整理)
Sep 17 Javascript
js中setTimeout的妙用--防止循环超时
Mar 06 Javascript
前端跨域的几种解决方式总结(推荐)
Aug 16 Javascript
基于vue实现移动端圆形旋钮插件效果
Nov 28 Javascript
vue使用keep-alive保持滚动条位置的实现方法
Apr 09 Javascript
angular 服务随记小结
May 06 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
Feb 07 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
Aug 20 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实现给一张图片加上水印效果
2016/01/02 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
php实现的生成排列算法示例
2019/07/25 PHP
php7性能提升的原因详解
2019/10/13 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
JavaScript & jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
babel基本使用详解
2017/02/17 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
Python open()文件处理使用介绍
2014/11/30 Python
python制作最美应用的爬虫
2015/10/28 Python
Python 实现随机数详解及实例代码
2017/04/15 Python
python下载图片实现方法(超简单)
2017/07/21 Python
深入理解Python中的super()方法
2017/11/20 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
python判断字符串以什么结尾的实例方法
2020/09/18 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
统计系教授推荐信
2014/02/28 职场文书
争先创优公开承诺书
2014/08/30 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
公司宣传语大全
2015/07/13 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技