2014
Mar
09
最近看到 prototype.js 中看到一個很特別的 function 叫做 curry ,本來還想說「NBA 勇士隊的咖哩」 怎麼會出現在 JS 程式中呢?
當然這跟 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
- var o = Function.prototype;
- var slice = Array.prototype.slice;
- o.merge = function (array, args) {
- array = slice.call(array, 0);
- return this.update(array, args);
- }
- o.update = function (array, args) {
- var arrayLength = array.length, length = args.length;
- while (length--) array[arrayLength + length] = args[length];
- return array;
- }
- o.curry = function () {
- if (!arguments.length) return this;
- var __method = this, args = slice.call(arguments, 0);
- var self = this;
- return function() {
- var a = self.merge(args, arguments);
- return __method.apply(this, a);
- }
- }
- function f(x, y) {
- return Math.pow(x,y);
- }
- console.log(f(2, 3)); // output = 8
- var g = f.curry(2);
- console.log(g(3)); // output = 8