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使用技巧精萃[代码非常实用]
Nov 21 Javascript
jquery select(列表)的操作(取值/赋值)
Aug 06 Javascript
jQuery 开天辟地入门篇一
Dec 09 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
Mar 14 Javascript
Jquery显示、隐藏元素以及添加删除样式
Aug 09 Javascript
JavaScript基础知识学习笔记
Dec 02 Javascript
JavaScript原生对象常用方法总结(推荐)
May 13 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 Javascript
原生JS实现手动轮播图效果实例代码
Nov 22 Javascript
layui-table获得当前行的上/下一行数据的例子
Sep 24 Javascript
微信小程序中的列表切换功能实例代码详解
Jun 09 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
加强版phplib的DB类
2008/03/31 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
如何用php获取程序执行的时间
2013/06/09 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
简单的js表单验证函数
2013/10/28 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
javascript实现评分功能
2020/06/24 Javascript
python strip()函数 介绍
2013/05/24 Python
python不带重复的全排列代码
2013/08/13 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
ORACLE第二个十问
2013/12/14 面试题
LINUX下线程,GDI类的解释
2012/04/17 面试题
应聘教师推荐信
2013/10/31 职场文书
特色蛋糕店创业计划书
2014/01/28 职场文书
婚内分居协议书范文
2014/11/26 职场文书
2015大学迎新标语
2015/07/16 职场文书
遗嘱范文
2015/08/07 职场文书
爱国主题班会教案
2015/08/14 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP