2008-12-11 15 views
6

Qual è il modo migliore per implementare una classica funzione curry in actionscript con una bella sintassi?Flex: implementazione della classica funzione curry in ActionScript?

ho provato:

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

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

... approccio, ma che non ha funzionato.

credo di essere bloccato con un approccio brutta come ad esempio:

FunctionUtils.curry(fp, ... args) 

???

risposta

8

Devo ammettere che non ho mai capito la differenza tra "curry" e "partial". Io uso la seguente funzione di fare più o meno quello che si vuole fare:

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

Esempi di utilizzo:

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

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

Quale argomento è stato sostituito con 4? aob? – Dwayne

+0

b, gli argomenti sono associati da sinistra a destra. – Theo

1

finito con (fortemente ispirato dalla implementazione 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); 
} 

richiesta nella sezione commenti per mostrare un esempio di come usare questo:

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

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

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

esempio stupido, lo so, ma curry: ing è estremamente utile. Dai un'occhiata a http://www.svendtofte.com/code/curried_javascript/ per la teoria.

+0

Ora potreste darmi un esempio di dove si usa questa funzione curry? (Sarebbe di aiuto con la mia comprensione della programmazione funzionale di più) – defmeta

Problemi correlati