论坛首页 Web前端技术论坛

javascript中的curry

浏览 2688 次
精华帖 (0) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-02-15  
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();
   发表时间:2008-02-16  
真不错,给我一个解决问题的灵感了,非常感谢。
0 请登录后投票
   发表时间: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/
0 请登录后投票
   发表时间:2008-02-17  
Prototype1.6就有这个扩展……
0 请登录后投票
   发表时间: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吧

0 请登录后投票
   发表时间:2008-02-18  
笨笨狗 写道
Prototype1.6就有这个扩展……


嘿嘿,也是看了你的答复才知道javascript里面早就有了这样的扩展,前几天看到ibm developerworks上面有个介绍groovy的curry,顺手就写了一个javascript的curry测试一下,发现用来组合function还是很好用的,迟点研究一下Prototype1.6里面的实现
0 请登录后投票
   发表时间:2008-02-18  
gordon@java 写道
笨笨狗 写道
Prototype1.6就有这个扩展……


嘿嘿,也是看了你的答复才知道javascript里面早就有了这样的扩展,前几天看到ibm developerworks上面有个介绍groovy的curry,顺手就写了一个javascript的curry测试一下,发现用来组合function还是很好用的,迟点研究一下Prototype1.6里面的实现


看了以后发现基本差不多,不过因为Prototype里面并没有保留原有function,所以要做uncurry可能有点难
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics