对于函数柯里化的初步理解

函数柯里化,其实就是高阶函数的一个应用。

什么是高阶函数呢,就是将一个函数A作为另一个函数B的参数, B就是一个高阶函数。

所谓"柯里化",就是把一个多参数的函数,转化为单参数函数。

柯里化是指这样一个函数(假设叫做createCurry),他接收函数A作为参数,运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数。
**
举个例子:

const add = (x, y) => x + y;
add(1, 2) //3

👆上诉代码就很简单的一个求和计算值。

如果用柯里化函数思想我们可以写成这样👇

首先我们得有个接受两个参数的通用柯里化函数:

const curry = (binaryFn) => {
    return function (firstArg) {
        return function (secondArg) {
            return binaryFn (firstArg, secondArg) ;  // 为啥要嵌套那么多呢?基于什么思路呢?思考一下...
        };
    };
};

然后把add函数转化成一个柯里化的版本

const add = (x, y) => x + y;
const autoCurriedAdd = curry(add);
autoCurriedAdd(1)(2)  // 3

通过比较,柯里化函数明显把简单问题复杂化了,这个时候为啥还要用呢?

当然这只是其中的一个场景而已! 如果场景很多呢,然后都是接受两个参数,那么这个模板的作用就起来了。

比如说我们有个函数const mul = (x, y) => x * y ;

如果我们柯里化一下

const autoCurriedAdd = curry(mul);
autoCurriedAdd(1)(2)  // 2
image.png
image.png

当然上诉展示的只是两个参数的柯里化模板,三个参数可以依葫芦画瓢,如下:

const curry = (binaryFn) => {
    return function (firstArg) {
        return function (secondArg) {
            return function (thirdArg) {
                return binaryFn (firstArg, secondArg, thirdArg) ;  // 为啥要嵌套那么多呢?基于什么思路呢?思考一下...
            };
        };
    };
};

那么参数越来越多呢,那可咋整?

这个时候递归就出来了!!!

// 柯里化函数
const curry = (fn) => {
  if (typeof fn !== 'function') {
    throw Error('No function provided')
  }

  return function curriedFn (...args) {
    if (fn.length > args.length) {  // 未达到触发条件,继续收集参数
      return function () {
        return curriedFn.apply(null, args.concat([].slice.call(arguments)))
      }
    }
    return fn.apply(null, args)
  }
}

这样我们就可以接受多个参数了。

const multiply = (x, y, z, t) => x * y * z * t;

const curryMul = curry(multiply);
const result = curryMul(1)(2)(3)(4); // 1*2*3*4 = 24
image.png
image.png

这就很棒了,剩下的自己拓展吧!!!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容