函数柯里化的应用场景

简介: 函数柯里化在编程中广泛应用,如参数复用、提前返回部分计算结果、提高代码可读性和模块化程度。常见于函数式编程语言,也可在JavaScript等语言中实现,简化复杂操作。
  1. 参数复用

    • 示例场景:数学函数与配置参数复用:在数学计算或数据处理中,假设有一个通用的函数用于计算两点之间的距离,其公式为$\sqrt{(x_2 - x_1)^2+(y_2 - y_1)^2}$。如果要在多个地方计算二维平面上不同点与一个固定点(例如原点$(0,0)$)的距离,就可以使用函数柯里化。
    • 代码示例
      // 原始的计算两点距离的函数
      function distance(x1, y1, x2, y2) {
             
      return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
      }
      // 柯里化函数
      function curry(fn) {
             
      return function curried(...args) {
             
         if (args.length >= fn.length) {
             
             return fn.apply(this, args);
         } else {
             
             return function (...moreArgs) {
             
                 return curried.apply(this, args.concat(moreArgs));
             };
         }
      };
      }
      // 对distance函数进行柯里化
      const distanceFromOrigin = curry(distance)(0, 0);
      // 计算点(3,4)到原点的距离
      console.log(distanceFromOrigin(3, 4));
      
    • 在这个例子中,通过柯里化将计算与原点距离的函数distanceFromOrigin创建出来,以后每次计算某个点到原点的距离时,就不需要重复传入原点的坐标$(0,0)$,实现了参数复用,提高了代码的简洁性和可读性。
  2. 延迟执行与动态函数创建

    • 示例场景:事件处理与条件判断后的函数执行:在前端开发的事件处理中,根据用户的操作动态地决定执行的函数。例如,有一个按钮,点击按钮时,根据用户是否登录,执行不同的函数。
    • 代码示例
      function createEventHandler(loggedIn, actionIfLoggedIn, actionIfLoggedOut) {
             
      return function () {
             
         if (loggedIn) {
             
             return curry(actionIfLoggedIn)();
         } else {
             
             return curry(actionIfLoggedOut)();
         }
      };
      }
      function loggedInAction() {
             
      console.log("User is logged in and performing an action.");
      }
      function loggedOutAction() {
             
      console.log("User is logged out and performing an action.");
      }
      const buttonClickHandler = createEventHandler(true, loggedInAction, loggedOutAction);
      // 模拟按钮点击事件
      buttonClickHandler();
      
    • 这里,createEventHandler函数返回一个新的函数,这个新函数根据用户是否登录的状态,在点击事件发生时,通过柯里化延迟执行对应的loggedInActionloggedOutAction函数。这样可以灵活地根据运行时的条件来决定执行的函数,实现了延迟执行和动态函数创建。
  3. 函数组合与管道操作

    • 示例场景:数据处理管道与函数组合:在数据处理流程中,例如对一个数据集进行一系列的转换操作,如先过滤数据,再对过滤后的数据进行映射(转换数据格式),最后进行求和操作。
    • 代码示例
      // 过滤函数
      function filterData(data, predicate) {
             
      return data.filter(predicate);
      }
      // 映射函数
      function mapData(data, mapper) {
             
      return data.map(mapper);
      }
      // 求和函数
      function sumData(data) {
             
      return data.reduce((acc, cur) => acc + cur, 0);
      }
      // 柯里化函数
      function curry(fn) {
             
      return function curried(...args) {
             
         if (args.length >= fn.length) {
             
             return fn.apply(this, args);
         } else {
             
             return function (...moreArgs) {
             
                 return curried.apply(this, args.concat(moreArgs));
             };
         }
      };
      }
      // 柯里化各个函数
      const curriedFilter = curry(filterData);
      const curriedMap = curry(mapData);
      const curriedSum = curry(sumData);
      // 组合函数
      const dataProcessingPipeline = data => curriedSum(curriedMap(curriedFilter(data, num => num > 5), num => num * 2));
      const dataSet = [1, 3, 7, 9, 11];
      console.log(dataProcessingPipeline(dataSet));
      
    • 在这个例子中,通过柯里化将filterDatamapDatasumData函数转换为可以逐步应用的形式,然后组合成一个数据处理管道dataProcessingPipeline。这样可以方便地构建复杂的数据处理流程,每个函数都可以独立地进行单元测试和复用,并且通过柯里化可以灵活地调整参数的传递顺序和时机,实现函数的组合和管道操作。
相关文章
|
人工智能 自然语言处理 安全
从 ChatGPT 到 AI 大模型私有化部署,为什么企业需要私有化专属大模型?
目前,大模型已经能够切实的影响到我们每个人的工作、学习、生活,赋能千行万业,但是开放的大模型却无法很好的适应企业或单位的内部需要,为此,此处研究并提出为什么企业需要私有化大模型,并探讨私有化大模型的优势和挑战,同时本文也举出了一些实践落地的例子,希望能给读者带来一些思考和启发。
|
2月前
|
弹性计算 运维 小程序
阿里云服务器2核2G特价:轻量应用服务器38元、云服务器99元,带宽、云盘与活动入口和购买规则
2026年,阿里云推出2核2G特价云服务器,轻量应用服务器与经济型e实例分别以38元和99元年付价成为入门优选。前者适合追求极致性价比用户,用于网站搭建等场景,但需抢购且限新用户;后者提供稳定长效服务,新老用户同享99元/年价,续费同价,适合轻量级Web应用等场景。此外,阿里云还提供通用算力型u2i实例3折、第九代云服务器6.4折起等丰富优惠。
|
机器学习/深度学习 人工智能 算法
FinRobot:开源的金融专业 AI Agent,提供市场预测、报告分析和交易策略等金融解决方案
FinRobot 是一个开源的 AI Agent 平台,专注于金融领域的应用,通过大型语言模型(LLMs)构建复杂的金融分析和决策工具,提供市场预测、文档分析和交易策略等多种功能。
1714 13
FinRobot:开源的金融专业 AI Agent,提供市场预测、报告分析和交易策略等金融解决方案
|
JavaScript 前端开发 网络架构
函数柯里化:JavaScript中的高级技巧
函数柯里化:JavaScript中的高级技巧
|
JavaScript 前端开发 API
管理数据必备;侦听器watch用法详解,vue2与vue3中watch的变化与差异
一篇文章同时搞定Vue2和Vue3的侦听器,是不是很棒?不要忘了Vue3中多了一个可选项watchEffect噢。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
传感器 机器人
舵机内部结及工作原理浅析
舵机内部结及工作原理浅析
903 2
|
前端开发 JavaScript API
node事件循环中事件执行顺序
本文详细介绍了Node.js环境下的事件循环机制,包括其六个主要阶段:timers、I/O callbacks、idle, prepare、poll、check和close callbacks。文章通过具体代码示例解释了`setTimeout`、`setImmediate`和`process.nextTick`在事件循环中的执行顺序和区别。还探讨了在不同情况下(如I/O操作中)这些函数的执行顺序如何受到影响。最后,通过一个综合例子,展示了实际编码中事件循环的执行顺序。
505 1
node事件循环中事件执行顺序
vcpkg 命令行工具的选项说明
vcpkg 命令行工具的选项说明
558 0
|
JavaScript 安全 API
vue3注册添加全局实例属性的方法,如何在setup函数中调用
vue3注册添加全局实例属性的方法,如何在setup函数中调用
2131 2
|
Shell
轻量级状态管理库 Zustand 的基本使用
轻量级状态管理库 Zustand 的基本使用
583 0