浏览 2688 次
锁定老帖子 主题:javascript中的curry
精华帖 (0) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-02-15
//curry function Function.prototype.curry=function(){ var originFunc=this; var args=[]; for(var i=0;i<arguments.length;i++){ args[i]=arguments[i]; } if(args.length==0) args=null; var newFunc=function(){ var args=[]; for(var i=0;i<arguments.length;i++){ args[i]=arguments[i]; } args=arguments.callee.curryArgs.concat(args); if(args.length==0)args=null; return arguments.callee.originFunc.apply(this,args); } newFunc.curryArgs=args; newFunc.originFunc=originFunc; return newFunc; } //each function for array . test curry Array.prototype.each=function(f){ for(var i=0;i<this.length;i++){ f(this[i]); } } //map function for array,generate new array, test curry Array.prototype.map=function(f){ var result=[]; for(var i=0;i<this.length;i++){ result[i]=f(this[i]); } return result; } //test run function run(){ var composit=function(f,g,x){ return f(g(x)); } var mul=function(x,y){ return x*y; } //var triple=mul.curry(3); //alert(triple(4)); var double=mul.curry(2); //var sixTimes=composit.curry(double).curry(triple); //var al6=composit.curry(alert).curry(sixTimes); //al6(10); var app=function(f,list){ list.each(f); } var map=function(f,list){ return list.map(f); } var l=[8,7,6]; l.alertEach=l.each.curry(alert); l.alertEach(); app.curry(alert)(l); composit.curry(alert,map.curry(double))(l); } run(); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-02-16
真不错,给我一个解决问题的灵感了,非常感谢。
|
|
返回顶楼 | |
发表时间:2008-02-16
纯粹碰巧遇到一个:
Function.prototype.toSelfCurrying = function(n) { n = n || this.length; var method = this; return function() { if (arguments.length >= n) return method.apply(this, arguments); return method.curry.apply(arguments.callee, arguments); }; }; http://blog.jcoglan.com/2007/12/12/self-currying-javascript-functions/ |
|
返回顶楼 | |
发表时间:2008-02-17
Prototype1.6就有这个扩展……
|
|
返回顶楼 | |
发表时间:2008-02-18
sp42 写道 纯粹碰巧遇到一个:
Function.prototype.toSelfCurrying = function(n) { n = n || this.length; var method = this; return function() { if (arguments.length >= n) return method.apply(this, arguments); return method.curry.apply(arguments.callee, arguments); }; }; http://blog.jcoglan.com/2007/12/12/self-currying-javascript-functions/ 仔细看了一下,这段代码需要Prototype才能用,因为会调用Function.prototype.curry,不过跟我上面的代码也可以运行。 准确的来说能curry就应该能uncurry,所以我写的这个只能算partial application吧 |
|
返回顶楼 | |
发表时间:2008-02-18
笨笨狗 写道 Prototype1.6就有这个扩展……
嘿嘿,也是看了你的答复才知道javascript里面早就有了这样的扩展,前几天看到ibm developerworks上面有个介绍groovy的curry,顺手就写了一个javascript的curry测试一下,发现用来组合function还是很好用的,迟点研究一下Prototype1.6里面的实现 |
|
返回顶楼 | |
发表时间:2008-02-18
gordon@java 写道 笨笨狗 写道 Prototype1.6就有这个扩展……
嘿嘿,也是看了你的答复才知道javascript里面早就有了这样的扩展,前几天看到ibm developerworks上面有个介绍groovy的curry,顺手就写了一个javascript的curry测试一下,发现用来组合function还是很好用的,迟点研究一下Prototype1.6里面的实现 看了以后发现基本差不多,不过因为Prototype里面并没有保留原有function,所以要做uncurry可能有点难 |
|
返回顶楼 | |