lenguaje - Flex: implementando la función clásica de curry en actionscript?
as3 rpdr (2)
¿Cuál es la mejor manera de implementar una función de curry clásica en ActionScript con una sintaxis agradable?
He intentado:
Function.prototype.curry = function()
{
return "helloWorld";
}
trace((function():void {}).curry());
... enfoque pero eso no funcionó.
Supongo que estoy atascado con un enfoque desagradable como:
FunctionUtils.curry(fp, ... args)
???
Terminó con (fuertemente inspirado por la implementación de 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);
}
Solicite en la sección de comentarios para mostrar un ejemplo de cómo usar esto:
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.
Debo admitir que nunca he entendido la diferencia entre "curry" y "parcial". 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