2 # 函数柯里化

简介: 2 # 函数柯里化

什么是函数柯里化

函数柯里化(Currying)是一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术。

通过函数柯里化,我们可以将原来接受多个参数的函数,转换为一系列只接受单一参数的函数,每个函数接收一个参数,返回一个新函数,最后一个新函数返回最终结果。

例子:

function add(x, y, z) {
    return x + y + z;
}
console.log(add(1, 2, 3));

我们可以通过函数柯里化将其转换为一个接受单一参数的函数,并返回一个新的函数,直到所有参数都被传递完毕为止。

function curryingAdd(x) {
    return function (y) {
        return function (z) {
            return x + y + z;
        };
    };
}
console.log(curryingAdd(1)(2)(3));

函数柯里化本质上是一种闭包的应用,通过保留原函数的参数,生成一个新函数,在新函数中再次调用原函数并传递参数,最终得到结果。

例子:判断变量的类型

常用的判断类型的方法有四种

  1. typeof 不能判断对象类型 (typeof []typeof {} 都是 ‘object’)
  2. constructor 可以找到这个变量时通过谁构造出来的
  3. instanceof 判断谁是谁的实例 __proto__
  4. Object.prototype.toString.call() 不能细分谁是谁的实例
function isType(type, value) {
    return Object.prototype.toString.call(value) === `[object ${type}]`;
}
console.log(isType("Array", []));

细分方法:我们可以写成下面的形式

function isType2(type) {
    return function (value) {
        return Object.prototype.toString.call(value) === `[object ${type}]`;
    };
}
let isArray = isType2("Array");
console.log(isArray({}));

如何通过一个柯里化函数实现通用的柯里化方法?

const currying = (fn, arr = []) => {
    // 函数的长度 length 属性指明函数的形参个数。
    let len = fn.length;
    return function (...args) {
        let newArr = [...arr, ...args];
        if (newArr.length < len) {
            // 递归
            return currying(fn, newArr);
        } else {
            return fn(...newArr);
        }
    };
};

测试例子

let isArray2 = currying(isType)("Array");
console.log("isArray2----------");
console.log(isArray2("kaimo"));
console.log(isArray2([]));
let isString2 = currying(isType)("String");
console.log("isString2----------");
console.log(isString2("kaimo"));
console.log(isString2([]));
let add2 = currying(add);
console.log("add2----------");
console.log(add2(1)(2)(3));

目录
相关文章
|
2月前
|
JavaScript 前端开发 Java
实现函数的柯里化
本文介绍了在JavaScript、Python和Java三种编程语言中实现函数柯里化的具体方法。JavaScript通过自定义`curry`函数实现,Python利用`functools.partial`简化过程,而Java则通过定义辅助函数达成目的。每种语言的实现细节虽有差异,但均能有效支持函数的分步参数传递与调用。
|
5月前
函数声明与函数表达式的区别是什么?
函数声明与函数表达式的区别是什么?
57 0
|
8月前
|
JavaScript 前端开发
函数声明与函数表达式的区别
函数声明与函数表达式的区别
37 2
|
8月前
|
JavaScript 索引 Windows
函数柯里化
函数柯里化
52 0
|
存储
函数声明与函数表达式的区别?
函数声明与函数表达式的区别?
40 0
|
JavaScript 前端开发 Java
函数式编程入门:理解纯函数、高阶函数与柯里化
函数式编程入门:理解纯函数、高阶函数与柯里化
195 0
柯里化函数简单实现
柯里化是一种函数式编程技术,可以将一个接受多个参数的函数转换成一系列接受一个参数的函数,这些函数可以在被顺序调用的过程中逐步累积参数,最终返回结果。
|
存储 JavaScript 前端开发
柯里化
柯里化
78 0
|
自然语言处理 JavaScript 前端开发
一文讲懂什么是函数柯里化,柯里化的目的及其代码实现
一文讲懂什么是函数柯里化,柯里化的目的及其代码实现
315 0
一文讲懂什么是函数柯里化,柯里化的目的及其代码实现
|
算法 Python
【Python函数式编程】——返回函数
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
142 0
【Python函数式编程】——返回函数