`
gordonAtJava
  • 浏览: 8037 次
文章分类
社区版块
存档分类
最新评论

javascript中的curry

阅读更多
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();
分享到:
评论
6 楼 gordonAtJava 2008-02-18  
gordon@java 写道
笨笨狗 写道
Prototype1.6就有这个扩展……


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


看了以后发现基本差不多,不过因为Prototype里面并没有保留原有function,所以要做uncurry可能有点难
5 楼 gordonAtJava 2008-02-18  
笨笨狗 写道
Prototype1.6就有这个扩展……


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

3 楼 笨笨狗 2008-02-17  
Prototype1.6就有这个扩展……
2 楼 sp42 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/
1 楼 kebo 2008-02-16  
真不错,给我一个解决问题的灵感了,非常感谢。

相关推荐

    前端JavaScript彻底弄懂函数柯里化curry.docx

    【前端JavaScript彻底弄懂函数柯里化curry】 一、什么是柯里化(curry) 在编程领域,尤其是JavaScript中,柯里化是一种将接受多个参数的函数转换为一系列只接受一个参数的函数的技术。其核心思想是将一个多参数...

    javascript函数式编程

    Monad是一个抽象的数学概念,在JavaScript中被用来处理异步操作和进行错误处理。 函数饲养:函数饲养(Function Breeding)是创建新函数的方法,通常用于高阶函数中。 Pointfree编程:Pointfree风格是指在编程中,...

    Functional Javascript Workshop

    在“Functional Javascript Workshop”中,我们将深入探讨JavaScript中的函数式编程概念和技术。函数式编程是一种编程范式,强调使用函数作为基本构建块,避免改变状态和可变数据,从而提高代码的可读性和可维护性。...

    JavaScript模式中文[pdf] 百度云

     Curry  小结  第5章 对象创建模式  命名空间模式  声明依赖关系  私有属性和方法  模块模式  沙箱模式  静态成员  对象常量  链模式  method()方法  小结  第6章 代码复用模式  传统与现代继承模式...

    JavaScript_实用函数式Javascript.zip

    在JavaScript中,可以使用`Function.prototype.bind()`或lodash/ramda库中的`curry`函数实现柯里化,这有助于创建可重用的、更灵活的代码。 4. 函数组合(Function Composition):这是将多个小功能组合成更复杂...

    前端大厂最新面试题-curry.docx

    在前端工程师的面试中,`curry`是一个常见的概念,尤其在涉及到函数式编程的时候。`curry`函数的主要作用是将一个多参数的函数转换成一系列单参数的函数,允许我们逐步提供参数并最终得到结果。这个过程被称为柯里化...

    深化解析JavaScript中函数的Currying柯里化_.docx

    JavaScript中的柯里化(Currying)是一种将接受多个参数的函数转换为接受单个参数的函数的技术,每次只处理一个参数,并返回一个新的函数以处理剩余的参数。这种技术源自数学家哈斯凯尔·加德纳·柯里,因此得名。...

    JavaScript网页设计300例CHM

    5. **函数式编程**:JavaScript支持函数式编程概念,如高阶函数、闭包和 curry 化。这些实例可能包含对这些技术的应用。 6. **面向对象编程**:JavaScript支持类和对象,可以创建复杂的面向对象系统。实例将涵盖...

    JavaScript - Complete JavaScript professional tips secrets

    本书旨在为JavaScript开发者提供一系列实用且深入的专业技巧,帮助他们在实际开发过程中更好地掌握这门语言的核心特性及其应用场景。书中涵盖了从基础到进阶的多个方面,包括但不限于如何在浏览器环境中与用户交互、...

    JavaScript函数式编程

    在JavaScript中,`map`、`filter`、`reduce`等方法都是高阶函数的例子,它们用于操作数组,而`compose`和`curry`则用于组合和封装函数。 4. 闭包 闭包是函数能够访问其词法作用域内的变量,即使在其定义的作用域...

    JavaScript 函数式编程 (英文版)

    9. **函数式编程库**:在JavaScript中,有很多库如Ramda、Lodash的_.fp模块等,它们提供了丰富的函数式编程工具,如curry、pipe、map、filter等功能,方便开发者实践函数式编程。 10. **函数式编程与React**:React...

    js代码-curry函数实现

    JavaScript中的Curry函数,也称为部分应用函数,是一种将接受多个参数的函数转换为一系列只接受一个参数的函数的技术。这种技术源于数学家Haskell Curry,因此得名。Curry化的主要目的是提高代码的可读性和重用性,...

    基本上是javascript中对FP的足够指导.zip

    **JavaScript中的函数式编程基础** 在JavaScript的世界里,函数式编程(Functional Programming,简称FP)是一种编程范式,它强调将计算视为函数的数学运算,而不是改变状态或跳转流程。这种风格的编程有助于创建...

    【JavaScript源代码】怎样用Javascript实现函数柯里化与反柯里化.docx

    JavaScript中的函数柯里化(Currying)是一种将接受多个参数的函数转换成一系列接受单一参数的函数的技术。这种技术源自于数学家Haskell Brooks Curry的名字,它的主要思想是每次只处理一个参数,然后返回一个新的...

    深入解析 JavaScript 中的高阶函数与函数式编程技巧

    JavaScript 中几种重要的高阶函数及其应用方式,其中包括通过 rest 参数传递任意参数(addArrayElements 函数)、数组映射转换(arrToString 方法)、闭包用于封装状态计数器(makeCounter 函数)、柯里化(curry 化...

    javascript函数式编程 underscore.js

    Underscore.js是一个轻量级的JavaScript实用库,它为开发者提供了大量函数式编程工具,使得在JavaScript中实践函数式编程变得更加容易。 在JavaScript中,函数式编程的核心概念包括: 1. **纯函数**:一个纯函数在...

    javascript10 宝典.zip

    5. **函数式编程**:JavaScript也具有函数式编程的特点,如高阶函数、闭包和 curry 化等,这部分内容可以帮助开发者写出更简洁、可维护的代码。 6. **异步编程**:JavaScript的异步处理是其独特之处,涉及到回调...

    在战斗中召唤机械师_JavaScript_下载.zip

    《在战斗中召唤机械师——JavaScript编程指南》 在当今数字化的世界中,JavaScript以其灵活性和广泛的应用场景,已经成为Web开发的必备语言。本资源“在战斗中召唤机械师_JavaScript_下载.zip”是一个专门为初学者...

Global site tag (gtag.js) - Google Analytics