柯里化详解

news/2024/6/17 1:49:00

柯里化详解

  • 介绍
  • 玩具版柯里化
  • 真正的柯里化(面试必备)

介绍

柯里化(Currying)是一种函数式编程技术,它将一个接受多个参数的函数转换为一系列接受单一参数的函数。柯里化的主要目的是让函数更易于复用和组合。通过柯里化,你可以创建一些预先填充了部分参数的函数变体,并在后续调用中重用它们。这种特性使得柯里化函数非常适合用于创建可配置的函数和简化代码

柯里化的用途:

  1. 提高函数的复用性:通过创建部分应用的函数变体,可以重用某些已经设置好的参数,从而减少重复代码。
  2. 函数组合:柯里化有助于组合多个简单的函数以创建更复杂的函数。这使得代码更具可读性和可维护性。
  3. 延迟计算:柯里化允许将多个参数分开传递,可以用于创建需要在将来执行的函数,从而实现延迟计算。

何时使用柯里化:

  1. 当你需要创建具有预设参数的函数变体时。
  2. 当你希望将多个简单函数组合为更复杂的函数时。
  3. 当你希望实现部分应用或延迟计算的功能时。

使用场景:

  1. 数据处理:例如,你可以创建一个柯里化的数据转换函数,它接受一个转换函数和一个数据集,然后返回一个新的经过转换的数据集。通过部分应用转换函数,你可以创建多个预设的数据处理函数,以便在不同场景中重用。
  2. 配置和选项设置:你可以创建一个柯里化的配置函数,它接受一些选项并返回一个新的已配置的函数。这样你可以创建多个预设的函数,它们已经具有特定的配置选项。
  3. 事件处理:在处理用户界面事件时,柯里化可以帮助你创建预设的事件处理函数,它们已经知道如何处理特定类型的事件或特定目标元素。

总之,柯里化是一个非常有用的函数式编程技术,可以帮助你创建更简洁、更具可读性和可维护性的代码。在需要复用函数、组合函数或实现延迟计算的场景中,柯里化是一个非常有价值的工具。

玩具版柯里化

旨在让你明白柯里化是什么意思

function sum (a) {
    return (b) => {
       return (c) => {
           return a + b + c
       }
    }
  }
   sum(1)(2)(3)//6

真正的柯里化(面试必备)

旨在让你理解柯里化是如何实现的

n curry(fn) {
    return function curried(...args) {
        // 在 JavaScript 中,函数对象有一个名为 length 的属性,表示函数期望接收的参数数量。
      if (args.length >= fn.length) {
        return fn.apply(this, args);
      } else {
        return function (...args2) {
            // 这里确实涉及到了递归。
          return curried.apply(this, args.concat(args2));
        };
      }
    };
  }
  

  // 定义一个简单的加法函数
function add(a, b, c) {
    return a + b + c;
  }
  
  // 使用 curry 函数对 add 函数进行柯里化
  const curriedAdd = curry(add);
  
  // 现在可以像这样使用 curriedAdd 函数
  console.log(curriedAdd(1)(2)(3)); // 输出:6
  console.log(curriedAdd(1, 2)(3)); // 输出:6
  console.log(curriedAdd(1, 2, 3)); // 输出:6
  

 

注意点:

  • 在 JS中,函数对象有一个名为 length 的属性,表示函数期望接收的参数数量。而不是fn的长度!
  • 柯里化确实涉及到了递归。

http://www.niftyadmin.cn/n/321216.html

相关文章

基于企业网的信息安全防护系统的设计与实现_kaic

摘 要 这篇文章提供了一种新的,基于“禁止一切”安全策略和VxD技术的企业网络安全保障方案,旨在帮助企业更好地应对外界的威胁。通过设计一套完善的企业网信息安全防护系统,不仅可以有效地解决企业网络中存在的问题,而且还可以有…

Testing and fault tolerence考试要点

文章目录 ATPGFault modelScanFunctional testMemory BISTLogic BISTboundary scanATEIddq testingFault tolerant designRisk analysis ATPG ATPG工作流程fault collapsing的原则 Fault model 有哪些fault model以及他们的工作原理 Scan Scan寄存器结构Scan Chain的连接方…

Cypher的使用说明

一、简介 1.1 常用的命令和函数 Cypher查询语言也叫做CQL。 常用的命令如下: CQL命令作用用法CREATE创建创建节点,关系和属性MATCH匹配检索有关节点,关系和属性数据RETURN返回返回查询结果WHERE哪里提供条件过滤检索数据DELETE删除删除节…

基于微信小程序校内论坛系统

开发工具:IDEA、微信小程序 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 前端技术:vue、uniapp 服务端技术:springbootmybatis-plus 本系统分微信小程序和管理后台两部分&am…

如何设计API返回码(错误码)?

一、前言 客户端请求 API,通常需要通过返回码来判断 API 返回的结果是否符合预期,以及该如何处理返回的内容等 相信很多同学都吃过返回码定义混乱的亏,有的 API 用返回码是 int 类型,有的是 string 类型,有的用 0 表…

ChatGPT、Midjourney不香了吗,New Bing 已向全球个人开放

文章目录 1. 前言2. 教程3. 开始 Bing AI 以上图片均由Bing AI生成。(后文给出第一幅图的关键字) 本文没有任何广告,放心食用,并且手把手教你怎么配置new bing,有需要的耐心看完哦,不懂的可私信我~ 1. 前…

[数据集][目标检测]篮球数据集VOC格式7398张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):7398 标注数量(xml文件个数):7398 标注类别数:1 标注类别名称:["basketball"]…

如何用Beautiful Soup解析HTML内容

Beautiful Soup是一种Python的解析库,主要用于解析和处理HTML/XML内容。它是基于Python的标准库和第三方库的结合,能够提供简便的方式实现文本的查找、修改和提取操作。 HTML指的是超文本标记语言(Hypertext Markup Language)&am…