2008-02-15
javascript中的curry
关键字: 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();
评论
gordon@java
2008-02-18
gordon@java 写道
笨笨狗 写道
Prototype1.6就有这个扩展……
嘿嘿,也是看了你的答复才知道javascript里面早就有了这样的扩展,前几天看到ibm developerworks上面有个介绍groovy的curry,顺手就写了一个javascript的curry测试一下,发现用来组合function还是很好用的,迟点研究一下Prototype1.6里面的实现
看了以后发现基本差不多,不过因为Prototype里面并没有保留原有function,所以要做uncurry可能有点难
gordon@java
2008-02-18
笨笨狗 写道
Prototype1.6就有这个扩展……
嘿嘿,也是看了你的答复才知道javascript里面早就有了这样的扩展,前几天看到ibm developerworks上面有个介绍groovy的curry,顺手就写了一个javascript的curry测试一下,发现用来组合function还是很好用的,迟点研究一下Prototype1.6里面的实现
gordon@java
2008-02-18
sp42 写道
纯粹碰巧遇到一个:
http://blog.jcoglan.com/2007/12/12/self-currying-javascript-functions/
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-17
Prototype1.6就有这个扩展……
sp42
2008-02-16
纯粹碰巧遇到一个:
http://blog.jcoglan.com/2007/12/12/self-currying-javascript-functions/
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/
kebo
2008-02-16
真不错,给我一个解决问题的灵感了,非常感谢。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 726 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
在java中小试FP(一)
补充以下,http://www.javaeye.com/topic/7569 我 ...
-- by gordon@java -
在java中小试FP(二)
在java中实现functional programming的一些特性,并且可以 ...
-- by gordon@java -
在java中小试FP(二)
能不能先告诉我这一大段到底是要干什么?
-- by ray_linn -
javascript中的curry
gordon@java 写道笨笨狗 写道Prototype1.6就有这个扩展…… ...
-- by gordon@java -
javascript中的curry
笨笨狗 写道Prototype1.6就有这个扩展…… 嘿嘿,也是看了你的答复才 ...
-- by gordon@java






评论排行榜