浏览 655 次
|
精华帖 (0) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-02-18 关键字: javascript
curry 用来组合function还是8错的
//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();
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间: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可能有点难 |
|
| 返回顶楼 | |







