zoukankan      html  css  js  c++  java
  • JavaScript- The Good Parts function Curry

    Functions are values, and we can manipulate function values in interesting ways.Currying allows us to produce a new function by combining a function and an argument:

    var add1 = add.curry(1);
    document.writeln(add1(6));    // 7

    add1 is a function that was created by passing 1 to add’s curry method. The add1 function adds 1 to its argument. JavaScript does not have a curry method, but we can fix that by augmenting Function.prototype:

    Function.method('curry', function ( ) {
        var args = arguments, that = this;
        return function ( ) {
            return that.apply(null, args.concat(arguments));
        };
    });    // Something isn't right...

    The curry method works by creating a closure that holds that original function and the arguments to curry. It returns a function that, when invoked, returns the result of calling that original function, passing it all of the arguments from the invocation of curry and the current invocation. It uses the Array concat method to concatenate the two arrays of arguments together.

    Unfortunately, as we saw earlier, the arguments array is not an array, so it does not have the concat method. To work around that, we will apply the array slice method on both of the arguments arrays. This produces arrays that behave correctly with the concat method:

    Function.method('curry', function ( ) {
        var slice = Array.prototype.slice,
            args = slice.apply(arguments),
            that = this;
        return function ( ) {
            return that.apply(null, args.concat(slice.apply(arguments)));
        };
    });

    我想给所有的函数对象都添加curry方法:

    function add(){
        console.log(arguments);
    }
    add.curry();

    运行结果:

    > add.curry();
    TypeError: Object function add(){
    console.log('add');
    } has no method 'curry'
        at repl:1:5
        at REPLServer.self.eval (repl.js:110:21)
        at repl.js:249:20
        at REPLServer.self.eval (repl.js:122:7)
        at Interface.<anonymous> (repl.js:239:12)
        at Interface.emit (events.js:95:17)
        at Interface._onLine (readline.js:202:10)
        at Interface._line (readline.js:531:8)
        at Interface._ttyWrite (readline.js:760:14)
        at ReadStream.onkeypress (readline.js:99:10)

    其实add是一个函数对象,所有的函数都是Function的对象,它继承了Function.prototype:

    Function.prototype['curry'] = function ( ) {
        var slice = Array.prototype.slice,
            args = slice.apply(arguments),
            that = this;
        return function ( ) {
            return that.apply(null, args.concat(slice.apply(arguments)));
        };
    }

    现在所有的方法对象都会有curry方法了:

    > add2 = add.curry(1)
    [Function]
    > add2(2,3)
    { '0': 1, '1': 2, '2': 3 }
    undefined
    > add2(2,3,4)
    { '0': 1, '1': 2, '2': 3, '3': 4 }
    undefined
  • 相关阅读:
    F2. Same Sum Blocks (Hard) 解析(思維、前綴和、貪心)
    E. Copying Data 解析(線段樹)
    B. Nauuo and Circle 解析(思維、DP)
    POJ3436-ACM Computer Factory(最大流)
    A.牛牛扔牌(双端队列)/B.疯狂过山车(最长上升子序列)/C.牛牛的棋盘(容斥原理)
    CodeForces 665E. Beautiful Subarrays(字典树)(贪心)(异或前缀和)
    CodeForces 455C.Civilization(并查集)(树的直径)
    CodeForces 1021B. Chemical table(并查集)
    CodeForces 961E. Tufurama(主席树)
    CodeForces 1024C. Array Product(模拟)(分类讨论)
  • 原文地址:https://www.cnblogs.com/ghgyj/p/4005229.html
Copyright © 2011-2022 走看看