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 源代码显示控件 (Ajax加载方式).
May 18 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
Jan 23 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
jQuery浏览器CSS3特写兼容实例
Jan 19 Javascript
优化RequireJS项目的相关技巧总结
Jul 01 Javascript
jQuery添加删除DOM元素方法详解
Jan 18 Javascript
jQuery判断checkbox选中状态
May 12 Javascript
js获取上传文件的绝对路径实现方法
Aug 02 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
Mar 04 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 Javascript
原生js实现简单的焦点图效果实例
Dec 14 Javascript
JS中获取 DOM 元素的绝对位置实例详解
Apr 23 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
Thinkphp中的curd应用实用要点
2015/01/04 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
js对象的复制继承实例
2015/01/10 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
Python中线程编程之threading模块的使用详解
2015/06/23 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
金士达面试非笔试
2012/03/14 面试题
大学生职业生涯规划方案
2014/01/03 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
心理健康教育主题班会
2015/08/13 职场文书
小数乘法教学反思
2016/02/22 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle
golang语言指针操作
2022/04/14 Golang
centos7安装mysql5.7经验记录
2022/05/02 Servers
Moment的feature导致线上bug解决分析
2022/09/23 Javascript