2008-12-11 9 views
6

¿Cuál es la mejor manera de implementar una función curry clásica en actionscript con una sintaxis agradable?Flex: implementando la función clásica de curry en actionscript?

que he probado:

Function.prototype.curry = function() 
{ 
return "helloWorld"; 
} 

trace((function():void {}).curry()); 

... enfoque, pero que no funcionó.

Creo que estoy atascado con un enfoque fea como:

FunctionUtils.curry(fp, ... args) 

???

Respuesta

8

Debo admitir que nunca he entendido la diferencia entre "curry" y "parcial". Yo uso la siguiente función para hacer más o menos lo que quiere hacer:

package { 
    public function partial(func : Function, ...boundArgs) : Function { 
    return function(...dynamicArgs) : * { 
     return func.apply(null, boundArgs.concat(dynamicArgs)) 
    } 
    } 
} 

ejemplos de uso:

var multiply : Function = function(a : Number, b : Number) : Number { return a * b; } 
var multiplyByFour : Function = partial(multiply, 4); 

trace(multiplyByFour(3)); // => 12 
+0

¿Qué argumento se reemplaza por 4? ¿a o B? – Dwayne

+0

b, los argumentos están limitados de izquierda a derecha. – Theo

1

terminamos con (fuertemente inspirado por la implementación del dojo):

public static function curry(func:Function, ... args:Array):* 
{ 
    var arity:int = func.length; 
    var currying:Function = function(func:Function, arity:int, args:Array):* 
    { 
     return function(... moreArgs:Array):* { 
      if(moreArgs.length + args.length < arity) 
      { 
       return currying(func, arity, args.concat(moreArgs)); 
      } 
      return func.apply(this, args.concat(moreArgs)); 
     } 
    } 
    return currying(func, arity, args); 
} 

pedido en la sección de comentarios para mostrar un ejemplo de cómo utilizar este:

function foo(i:int, j:int):void 
{ 
    trace(i+j); 
} 

function bar(fp:Function):void 
{ 
    fp(2); 
} 

bar(FunctionUtils.curry(foo, 1)); //trace==3 

ejemplo tonto, lo sé, pero curry: ing es extremadamente útil. Eche un vistazo a http://www.svendtofte.com/code/curried_javascript/ para la teoría.

+0

Ahora usted podría darme un ejemplo de que puede utilizar esta función de curry? (Ayudaría a entender mejor la programación funcional) – defmeta

Cuestiones relacionadas