JavaScript 中的函数柯里化

JavaScriptJavaScriptBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将探索 JavaScript 中函数柯里化(currying)和反柯里化(uncurrying)的概念。函数柯里化是一种技术,它允许我们将一个接受多个参数的函数转换为一系列每个只接受一个参数的函数。另一方面,函数反柯里化是将一系列每个只接受一个参数的函数转换为一个接受多个参数的函数的过程。通过本实验,我们将学习如何在 JavaScript 中实现这两种技术。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("`JavaScript`")) -.-> javascript/BasicConceptsGroup(["`Basic Concepts`"]) javascript(("`JavaScript`")) -.-> javascript/AdvancedConceptsGroup(["`Advanced Concepts`"]) javascript/BasicConceptsGroup -.-> javascript/variables("`Variables`") javascript/BasicConceptsGroup -.-> javascript/data_types("`Data Types`") javascript/BasicConceptsGroup -.-> javascript/arith_ops("`Arithmetic Operators`") javascript/BasicConceptsGroup -.-> javascript/comp_ops("`Comparison Operators`") javascript/BasicConceptsGroup -.-> javascript/cond_stmts("`Conditional Statements`") javascript/AdvancedConceptsGroup -.-> javascript/error_handle("`Error Handling`") javascript/AdvancedConceptsGroup -.-> javascript/higher_funcs("`Higher-Order Functions`") javascript/AdvancedConceptsGroup -.-> javascript/spread_rest("`Spread and Rest Operators`") subgraph Lab Skills javascript/variables -.-> lab-28676{{"`JavaScript 中的函数柯里化`"}} javascript/data_types -.-> lab-28676{{"`JavaScript 中的函数柯里化`"}} javascript/arith_ops -.-> lab-28676{{"`JavaScript 中的函数柯里化`"}} javascript/comp_ops -.-> lab-28676{{"`JavaScript 中的函数柯里化`"}} javascript/cond_stmts -.-> lab-28676{{"`JavaScript 中的函数柯里化`"}} javascript/error_handle -.-> lab-28676{{"`JavaScript 中的函数柯里化`"}} javascript/higher_funcs -.-> lab-28676{{"`JavaScript 中的函数柯里化`"}} javascript/spread_rest -.-> lab-28676{{"`JavaScript 中的函数柯里化`"}} end

反柯里化一个函数

要将一个函数反柯里化到指定深度,请使用 uncurry 函数。

const uncurry =
  (fn, n = 1) =>
  (...args) => {
    const next = (acc) => (args) => args.reduce((x, y) => x(y), acc);
    if (n > args.length) throw new RangeError("参数太少!");
    return next(fn)(args.slice(0, n));
  };

要使用 uncurry 函数,将你想要反柯里化的函数以及你想要反柯里化到的深度作为参数传递。该函数将返回一个可变参数函数,你可以使用想要传递的参数来调用它。

如果你不指定深度,该函数将反柯里化到深度 1

const add = (x) => (y) => (z) => x + y + z;
const uncurriedAdd = uncurry(add, 3);
uncurriedAdd(1, 2, 3); // 6

如果你传递的参数数量小于指定深度,该函数将抛出一个 RangeError

总结

恭喜你!你已经完成了“反柯里化函数”实验。你可以在 LabEx 中练习更多实验来提升你的技能。

您可能感兴趣的其他 JavaScript 教程