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)