2008-12-11 27 views
6

Cách tốt nhất để triển khai hàm curry cổ điển trong ActionScript với cú pháp đẹp là gì?Flex: triển khai chức năng cà ri cổ điển trong ActionScript?

Tôi đã thử:

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

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

... cách tiếp cận nhưng điều đó không làm việc.

Tôi đoán tôi bị mắc kẹt với một cách tiếp cận xấu xí như:

FunctionUtils.curry(fp, ... args) 

???

Trả lời

8

Tôi phải thừa nhận tôi chưa bao giờ hiểu sự khác biệt giữa "cà ri" và "một phần". Tôi sử dụng các chức năng sau đây để làm được nhiều hơn hoặc ít hơn những gì bạn muốn làm:

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

ví dụ sử dụng:

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

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

Đối số nào được thay thế bằng 4? a hoặc b? – Dwayne

+0

b, đối số bị ràng buộc từ trái sang phải. – Theo

1

Đã kết thúc với (chủ yếu lấy cảm hứng từ thực hiện võ đường của):

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); 
} 

Yêu cầu trong phần ý kiến ​​để hiển thị một ví dụ về cách sử dụng này:

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

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

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

dụ Silly, tôi biết, nhưng cà ri: ing là cực kỳ hữu ích. Có một cái nhìn tại http://www.svendtofte.com/code/curried_javascript/ cho lý thuyết.

+0

Bây giờ bạn có thể cho tôi một ví dụ về nơi bạn sẽ sử dụng chức năng cà ri này? (Nó sẽ giúp với sự hiểu biết của tôi lập trình chức năng hơn) – defmeta

Các vấn đề liên quan