2014
Mar
09

最近看到 prototype.js 中看到一個很特別的 function 叫做 curry ,本來還想說「NBA 勇士隊的咖哩」 怎麼會出現在 JS 程式中呢?

 NBA curry

當然這跟 NBA 一點關系都沒有, curry 在程式中的目前是為了簡化 function 的參數數量,當一個 function 有多個參數,那麼 Input 與 output 的線性關系就會變得很復雜,所以簡化成一個參數後,在數學就會變得比較好分析。

例如一個次方函數式 f(x, y) = x^y ,這個函數式必須傳進兩個變數值, x 與 y ,若是我傳入 f(2,3) , 回傳值就會是 8 ,那麼假如我須要一個底數為 2 的次方函數式,那麼我就可以定義一個新的 function : g(y) = f.curry(2) ,接著使用 g(3) 得到 8。

Prototye curry 定義: http://prototypejs.org/doc/latest/language/Function/prototype/curry/

Example of curry
  1. var o = Function.prototype;
  2. var slice = Array.prototype.slice;
  3. o.merge = function (array, args) {
  4. array = slice.call(array, 0);
  5. return this.update(array, args);
  6. }
  7.  
  8. o.update = function (array, args) {
  9. var arrayLength = array.length, length = args.length;
  10. while (length--) array[arrayLength + length] = args[length];
  11. return array;
  12. }
  13.  
  14. o.curry = function () {
  15. if (!arguments.length) return this;
  16. var __method = this, args = slice.call(arguments, 0);
  17. var self = this;
  18. return function() {
  19. var a = self.merge(args, arguments);
  20. return __method.apply(this, a);
  21. }
  22. }
  23.  
  24.  
  25. function f(x, y) {
  26. return Math.pow(x,y);
  27. }
  28. console.log(f(2, 3)); // output = 8
  29. var g = f.curry(2);
  30.  
  31. console.log(g(3)); // output = 8

相關資料


回應 (Leave a comment)