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