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 两个窗体之间传值实现代码
Sep 25 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
Nov 08 Javascript
深入理解JavaScript编程中的原型概念
Jun 25 Javascript
jQuery实现类似淘宝网图片放大效果的方法
Jul 08 Javascript
js表单登陆验证示例
Oct 19 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
Apr 11 Javascript
纯js实现隔行变色效果
Nov 29 Javascript
使用Vue制作图片轮播组件思路详解
Mar 21 Javascript
Angularjs实现数组随机排序的方法
Oct 02 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
Nov 14 Javascript
Element Input输入框的使用方法
Jul 26 Javascript
浅谈node.js中间件有哪些类型
Apr 29 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
Smarty Foreach 使用说明
2010/03/23 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
javascript 伪数组实现方法
2010/10/11 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
2015/12/13 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
js实现拖拽功能
2017/03/01 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
Python编程实现正则删除命令功能
2017/08/30 Python
HTML的form表单和django的form表单
2019/07/25 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
python  logging日志打印过程解析
2019/10/22 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
小学一年级学生评语
2014/04/22 职场文书
优秀班集体申报材料
2014/12/25 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
python如何进行基准测试
2021/04/26 Python
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript