一道函数柯里化的面试题

题目如下:

    // 1.构造函数 currying,实现如下操作, (部分实施)
    const f = (a, b ,c) => {
        return a + b + c;
    };

    const g = currying(f, 1);
    g(2, 3); // -> 6

    const g2 = currying(f, 1, 2);
    g2(3); // -> 6

    // 2.构造函数 currying,实现如下操作, (柯里化)
    const f = (a, b, c) => {
        return a + b + c;
    };
    const g = currying(f);

    g(1)(2)(3) // -> 6 

当我看到这个题的时候还没了解过什么是函数柯里化,于是我是这么做的:

    // 1.
    function currying(fun) {
        let arg = Array.prototype.slice.call(arguments, 1);

        return function(){
            return fun(...arg, ...arguments);
        }
    }
    
    // 2.
    function currying(fun) {
        let f = function () {
            f.arg? f.arg.push(arguments[0]): f.arg = [arguments[0]];
            return f;
        };

        f.toString = function() {
            return fun(...f.arg);
        };

        return f;
    }

最后运行结果是正确的,做完以后查了一下函数柯里化的概念,总结:
简而言之,函数柯里化就是把接收多个参数的函数转变为接收一个单一参数的函数,并且返回接收余下参数的函数.

作用:

  • 提高适用性;
  • 延迟执行;
  • 固定易变因素;

你可能感兴趣的:(一道函数柯里化的面试题)