JS手写:从0开始认识【柯里化】【支持占位符的柯里化】

news2024/12/23 13:55:23

柯里化

功能介绍

柯里化是拆分函数的一种手段,允许我们以偏函数的方式调用这个函数。

比如说,原来的函数A必须传入三个参数才能运行。经过柯里化处理之后的函数KA传入三个参数,能成功运行;传入两个参数也能,但是会返回一个需要传入一个参数才能运行的函数KB,在KB中传入剩下的一个参数后,能得到在A中传入三个才能得到的结果。

这么讲很抽象吧,我们举一个例子

创建一个sum函数

3c481b9881834e169bda4467f6c9d6d5.png

现在我可以使用这个函数进行计算了。但是如果说我现在有100个计算式,这100个前面的两个被加数都是1,2,那我有没有必要调用这个函数传100个1,2呢

很明显是没有必要的。

如果我们将这个函数柯里化一下,得到新的函数

b9fa7b57f9404581becf0d42f3129967.png

我们就会发现哇塞这个新函数想怎么用就怎么用了。

这个就是柯里化的实质,他把函数拆,将函数的粒度调小了,使得我们的代码复用性大大增加

实现原理

我们来看功能猜实现,猜一下这个柯里化函数是做了什么操作。

首先,函数柯里化是手动将函数内部实现的功能按一个参数一个参数的拆分了吗?

既然函数里化是一种加工函数方式,那么对所有函数都是适用的,这就导致他不涉及函数的执行思路,只和函数的参数个数有关

那么他就不是在拆功能了,那是在拆什么呢?

函数柯里化允许我们以偏函数方式调用,这说明其能自由的处理任意传入的参数。相当于你每次传入的参数都会被存起来,只有当所有参数都传满的时候才会被调用。

那么柯里化之后的函数,如果参数没传满,返回的肯定也是一个函数。

那么我们就有大概的思路了:首先要解决之前传入的参数在新的返回的函数中能使用,这说明他里面肯定在利用闭包(又是闭包)。

其次,如果没传满就一直按照原本方式传,传满了就执行,这个也很明显了,肯定就是递归,以传满为递归条件结束进行返回。

那么思路就很清晰了,就是递归+闭包。

代码

7af4918721cd4ca98cbd1600ed7e2470.png

其实还是比较简单的,除去注释代码只有11行。

支持占位符的柯里化

上一个函数柯里化还是有痛点的,那就是他仅支持顺序传入参数

还是那个add的例子,如果说现在我传入的1,2位于第二,三个参数的位置,这个柯里化函数还能用吗?

完蛋了,又要重新开始加100遍。

那么我们就需要一种更加灵活的柯里化方式,支持我们乱序传入参数,暂时不能确定的参数,传一个空格。

其实也很简单,在刚刚代码的基础上加上一个参数串中是否有占位符的判断和参数置换逻辑就好了

c3b71e63eff2498f9ef91ba909405977.png

从这个上面其实还可以引申出更多柯里化变式,比如支持参数校验的柯里化,检测剩余参数的柯里化等等,不过基本思想和这个例子一致,使用正则等手段匹配校验一下就好了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebSocket 连接频繁断开的问题及解决方案

文章目录 WebSocket 连接频繁断开的问题及解决方案1. 引言2. 什么是 WebSocket?2.1 WebSocket 的优势2.2 WebSocket 的工作原理 3. WebSocket 连接频繁断开的常见原因3.1 服务器端问题3.1.1 服务器负载过高3.1.2 服务器配置不当3.1.3 超时设置 3.2 网络问题3.2.1 网…

openGauss开源数据库实战十二

文章目录 任务十二 openGauss逻辑结构:表管理任务目标实施步骤一、准备工作二、创建表1.新建表默认保存在public模式中2.在一个数据库的不同模式下创建表3.创建表的时候定义约束4.创建表时使用自增数据类型5.使用现有的表创建新表 三、查看表的信息1.在gsql中查看表的定义2.查看…

ADI仿真连接有效性检查方法

1、确认仿真器引脚接插OK. A、检查电脑正常连接 B、确认仿真器引脚定义匹配与上电正确连接 2、打开CCES,打开Debug Configurations 3、连接芯片类型选择 4、点击Configuratior… 5、选择Test…,在点Start,确认状态都OK,即可开始仿真调…

docker部署nginx+nacos+redis+java镜像和容器

nginx镜像制作 Dockerfile内容: # 基础镜像 FROM nginx # author MAINTAINER ruoyi# 挂载目录 VOLUME /home/ruoyi/projects/ruoyi-ui # 创建目录 RUN mkdir -p /home/ruoyi/projects/ruoyi-ui # 指定路径 WORKDIR /home/ruoyi/projects/ruoyi-ui # 复制conf文件到路…

SAP RFC 用户安全授权

一、SAP 通讯用户 对于RFC接口的用户,使用五种用户类型之一的“通讯”类型,这种类型的用户没有登陆SAPGUI的权限。 二、对调用的RFC授权 在通讯用户内部,权限对象:S_RFC中,限制进一步可以调用的RFC函数授权&#xff…

Uniapp的H5以及App不支持后端传FormData类型参数的解决方案

在uniapp中不支持FormData的传参,这就很恶心;如果强行传的话会提示,请求失败的报错信息。 因为后端必须要FormData类型的传参,所以在查阅一系列方案后,有一种解决办法可以完美解决。 代码: init() {const…

PyTorch 训练集、验证集、测试集、模型存档、正则化项

为什么要将数据集划分为三个部分?三个部分的作用?三个部分数据集的比例应如何设定? 另外一种常见的数据集划分方法是将数据集划分为两个部分(训练集和测试集),这种划分方法存在的问题在于,模型…

Flask轻松上手:从零开始搭建属于你的Web应用

目录 一、准备工作 二、安装Flask 三、创建你的第一个Flask应用 创建一个新的Python文件 编写Flask应用代码 运行Flask应用 四、创建一个简单的博客系统 定义路由和文章列表 创建模板文件 运行并测试博客系统 五、使用数据库存储用户信息 安装Flask-SQLAlchemy 修…

游戏启动失败:8种修复xinput1_3.dll错误的几种方法教程,轻松解决xinput1_3.dll错误

当你准备好在一天的工作后放松一下,启动你最爱的游戏,却突然收到一个“xinput1_3.dll 丢失”的错误消息,这无疑是令人沮丧的。幸运的是,xinput1_3.dll丢失问题通常可以通过几个简单的步骤来解决。本文将详细介绍这些步骤&#xff…

Halcon-模板匹配(WPF)

halcon的代码 dev_open_window (0, 0, 512, 512, black, WindowHandle) read_image (Image, C:/Users/CF/Desktop/image.jpg) dev_display (Image)draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) r…

《AI从0到0.5》之提示工程

参考资料:《AI提示工程:基础 应用 实例》万欣 主要内容: 该文章是对《AI提示工程:基础 应用 实例》这本书的浓缩整理,旨在让读者快速的了解AI提示工程的概念和设计原则、策略和技巧、部分应用案例。并结合笔者自…

@FISCO BCOS的朋友们,年度生态大会邀您查收成果集结令

七载春秋,繁星相映。站在开源七周年的重要节点上,FISCO BCOS年度生态大会再次面向全社区发出产业数字化成果集结令,邀请FISCO BCOS的朋友们于今年12月份共探区块链产业的发展现状与未来。 作为深圳国际金融科技节的重要组成部分和特色活动&a…

Linux文件清空的五种方法总结分享

简介: 每种方法各有优势,选择最合适的一种或几种,可以极大提高您的工作效率。更多有关Linux系统管理的技巧与资源,欢迎访问,持续提升您的运维技能。 在Linux操作系统环境下,清空文件内容是日常维护和管理中…

Android文件选择器[超级轻量级FilePicker测试没有问题][挣扎解决自带文件管理器获取不到绝对地址问题而是返回msf%3A1000038197]

超级轻量级FilePicker测试没有问题 本文摘录于:https://blog.csdn.net/gitblog_00365/article/details/141449437只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人! 今天真的是发了疯的找文件管理器,因为调用系统自带的文件管理…

向量的基础知识和矩阵向量的坐标旋转

向量的基础: 定义: 既有大小,又有方向的量叫做向量(Vector)。 在几何上,向量用有向线段来表示,有向线段长度表示向量的大小,有向线段的方向表示向量的方向。其实有向线段本身也是向…

java控制台打印加法口诀

具体代码&#xff1a; public class AdditionTable {public static void main(String[] args) {//add();//add2();//add3();add1();}public static void add(){for(int i2;i<10;i){for(int j1;j<i;j){String format String.format("%-7s",j""(i-j)…

【Deno运行时】深入解析Deno:下一代JavaScript和TypeScript运行时

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ Deno简介2️⃣ Deno的核心特性3️⃣ Deno与Node.js的区别4️⃣ …

OpenCV开发笔记(八十二):两图拼接使用渐进色蒙版场景过渡缝隙

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/143432922 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

数字IC后端实现之Innovus Place跑完density爆涨案例分析

下图所示为咱们社区a7core后端训练营学员的floorplan。 数字IC后端实现 | Innovus各个阶段常用命令汇总 该学员跑placement前density是59.467%&#xff0c;但跑完place后density飙升到87.68%。 仔细查看place过程中的log就可以发现Density一路飙升&#xff01; 数字IC后端物…

一文总结AI智能体与传统RPA机器人的16个关键区别

基于LLM的AI Agent&#xff08;智能体&#xff09;与**RPA&#xff08;机器人流程自动化&#xff0c;Robotic Process Automation&#xff09;**两种技术在自动化任务领域中扮演着至关重要的角色。AI智能体能够借助LLM拥有极高的灵活性&#xff0c;可以实时理解和响应环境的变化…