锁定老帖子 主题:高阶函数学习(JavaScript)
精华帖 (0) :: 良好帖 (11) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-31
最后修改:2009-04-16
大家不要被这个名字诱惑,我讲的是javascript的高阶函数的概念,而不是说本教程为高阶教程。
比如,我们每次需要计算一个数的立方数时,都需要写成x*x*x的形式,如果一个运算中有很多地方要用到立方这种运算的话,可能编码会非常麻烦,而且代码也不清晰,于是,我们可以将立方运算抽象成一个函数,这个函数接受一个输入,并返回这个输入的立方数。 function cube(x){return x*x*x;}
如输入[1,100],输出5050. function intSum(a, b){ function inc(x){ return x + 1; } function identity(x){ return x; } if(a > b){ return 0; }else{ return intSum( inc(a) , b) + identity(a); } }
如输入[1,4],输出100:1^3+2^3+3^3+4^3 = 1 + 8 + 27 + 64 = 100 function cubeSum(a, b){ function inc(x){ return x + 1; } function cube(x){ return x * x * x; } if(a > b){ return 0; }else{ return cubeSum( inc(a) , b) + cube(a); } }
随着项目的进一步增长,我们现在需要实现第三个函数,来对这样一个数列进行求和输入同样为[a,b]的一个范围,计算1/x*(x+2),且步长为4,这个数列的前n项的和有个性质,就是无限的接近pi/8这个数列当然是有用的,比如计算Pi值,我们给定一个比较大的范围如[1,10000]然后给这个值乘8,即可近似的计算出pi来。
function piSum(a, b){ function piTerm(x){ return 1/((x+2)*x); } function piNext(x){ return x+4; } if(a > b){ return 0; }else{ return piSum( piNext(a) , b) + piTerm(a); } }
现在,让我们比较一下这三个函数,很快我们就会发现,这三个函数太相似了,都是:
可以写成下面的这种伪码形式: function <funcName>(a, b){ if(a > b){ return 0; }else{ return <funcName>(<next>(a), b) + <func>(a); } }
function sum(term, a, next, b){ if(a > b){ return 0; }else{ return sum(term, next(a), next, b) + term(a); } }
function intSum(a, b){ function inc(x){return x + 1;} function identity(x){return x;} return sum(identity, a, inc, b); }
function cubeSum(a, b){ function inc(x){return x + 1;} function cube(x){return x * x * x;} return sum(cube, a, inc, b); }
function piSum(a, b){ function piTerm(x){ return 1/((x+2)*x); } function piNext(x){ return x+4; } return sum(piTerm, a, piNext, b); }
function sumTester(){ print(intSum(1, 100)); // should print 5050 print(cubeSum(1, 4)); // should print 100 print(piSum(1, 10000)*8); // should print PI }
写道
js> sumTester()
5050 100 3.141392653591793
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-04-17
函数抽象成这个层次还是不够,比如要表达一个对象的概念。某对象上的某操作,如OO语言中的:
<code>object.method();</code> 这种情况,需要提供更高级的抽象方式,在函数式编程中,这个“高级”的过程是可以迭代的,所以,你可以通过函数进行任意层次的抽象。 |
|
返回顶楼 | |
发表时间:2009-12-14
个人使用的真实感觉就是,当传递一个函数作为参数的时候,就像派了一个人去处理一样,顿时生动了,呵呵
|
|
返回顶楼 | |
发表时间:2009-12-14
szcjlssx 写道 个人使用的真实感觉就是,当传递一个函数作为参数的时候,就像派了一个人去处理一样,顿时生动了,呵呵
不错,所以这个被作为参数使用的函数被叫做“算子”,即用以执行某项任务的计算单元。函数式编程的重点正在与此! |
|
返回顶楼 | |
发表时间:2009-12-15
既然讲这些,是不是应该至少加入curry/uncurry的内容?
|
|
返回顶楼 | |
发表时间:2009-12-15
check 写道 既然讲这些,是不是应该至少加入curry/uncurry的内容?
curry不属于高阶函数吧?curry是函数式程序设计的一部分,但是高阶函数主要涉及对函数的多级抽象,curry则体现了“函数为一等公民”。 |
|
返回顶楼 | |
浏览 2969 次