MST
星途 面试题库

面试题:JavaScript 函数式编程的组合与柯里化

假设我们有三个函数:`add(a, b)` 用于两数相加,`multiply(a, b)` 用于两数相乘,`square(x)` 用于求一个数的平方。请使用组合和柯里化的方式,实现一个函数 `compute(a, b)`,该函数的计算逻辑为 `square(multiply(add(a, b), 2))`。请详细写出代码实现过程,并解释组合和柯里化在其中起到的作用。
15.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

代码实现

// 定义add函数
function add(a, b) {
    return a + b;
}

// 定义multiply函数
function multiply(a, b) {
    return a * b;
}

// 定义square函数
function square(x) {
    return x * x;
}

// 柯里化add函数
function curriedAdd(a) {
    return function(b) {
        return a + b;
    };
}

// 柯里化multiply函数
function curriedMultiply(a) {
    return function(b) {
        return a * b;
    };
}

// 柯里化square函数
function curriedSquare(x) {
    return function() {
        return x * x;
    };
}

// 组合函数
function compose(...fns) {
    return function(x) {
        return fns.reduceRight((acc, fn) => fn(acc), x);
    };
}

// 使用组合和柯里化实现compute函数
const compute = compose(
    curriedSquare,
    curriedMultiply(2),
    curriedAdd
);

// 测试compute函数
console.log(compute(3)(4)); 

组合和柯里化的作用解释

  1. 柯里化的作用
    • 柯里化将一个多参数函数转化为一系列单参数函数。例如,add(a, b) 函数通过柯里化变为 curriedAdd(a)(b),这使得函数更加灵活。在 compute 函数的构建中,柯里化后的函数可以方便地作为组合函数的一部分。比如 curriedMultiply(2) 固定了 multiply 函数的第一个参数为2,这样后续只需要传入第二个参数就可以进行乘法运算。
  2. 组合的作用
    • 组合函数 compose 接受一系列函数,并返回一个新函数。新函数会按照从右到左的顺序依次调用传入的函数,将前一个函数的返回值作为下一个函数的参数。在 compute 函数中,通过 compose 函数将 curriedSquarecurriedMultiply(2)curriedAdd 组合起来,实现了 square(multiply(add(a, b), 2)) 的计算逻辑。组合使得代码更加模块化和可维护,每个函数只负责单一的功能,通过组合可以构建出复杂的计算逻辑。