纯函数 和 函数柯里化 05 (待补充)

加油,今天周二啦!😍

文章目录

  • 前言
  • 一、js 的纯函数
  • 二、副作用
  • 三、纯函数的优势
  • 四、JavaScript 柯里化
  • 五、柯里化作用 - 让函数的职责单一
  • 六、柯里化作用 - 逻辑的复用
  • 七、将多个普通的函数,转成柯里化函数(我没太理解,等我理解了再更)
  • 八、理解组合函数
  • 九、


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、js 的纯函数


  • 函数式编程中有一个非常重要的概念叫纯函数,JavaScript 符合 函数式编程的范式,所以也有 纯函数 的概念
  • 在react开发中纯函数是被多次提及的,比如react中组件就被要求像是一个纯函数(为什么是像,因为还有class组件),redux中有一个reducer的概念,也是要求必须是一个纯函数;所以掌握纯函数对于理解很多框架的设计是非常有帮助的;

纯函数的维基百科定义:

  1. 在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数:
  2. 此函数在相同的输入值时,需产生相同的输出
  3. 函数的 输出和输入值以外的其他隐藏信息或状态无关 ,也和由 I/O设备产生的外部输出无关
  4. 该函数 不能有语义上可观察的函数副作用,诸如 “触发事件”使输出设备输出,或更改输出值以外物件的内容等。

当然上面的定义会过于的晦涩,所以我简单总结一下:

  1. 确定的输入,一定会产生确定的输出;
  2. 函数在执行过程中,不能产生副作用;

比如:

  • 数组方法:slicesplice
  • 在调用 slice 时,不会修改原始数据(输入数据)
  • 在调用 splice 时,会修改

二、副作用


纯函数在执行的过程中就是不能产生这样的副作用, 副作用往往是产生bug的 “温床”

  • 副作用(side effect)其实本身是医学的一个概念,比如我们经常说吃什么药本来是为了治病,可能会产生一些其他的副作用;
  • 在计算机科学中,也引用了副作用的概念,表示 在执行一个函数 时,除了 返回函数值之外 ,还对调用函数产生了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储;

三、纯函数的优势


  • 因为可以 安心的编写安心的使用
  1. 在写的时候保证了函数的纯度,只是单纯实现自己的业务逻辑即可,不需要关心传入的内容是如何获得的或
    者依赖其他的外部变量是否已经发生了修改;
  2. 在用的时候,确定你的输入内容不会被任意篡改,并且自己确定的输入,一定会有确定的输出;
  3. React中就要求我们无论是函数还是class声明一个组件,这个组件都必须像纯函数一样,保护它们的props不被修改
    在这里插入图片描述

四、JavaScript 柯里化


柯里化也是属于函数式编程里面一个非常重要的概念。

我们先来看一下维基百科的解释:

  1. 把接收多个参数的函数,变成接受一个单一参数(最初函数的第一个参数)的函数并且返回接受余下的参数,而且 返回结果的新函数的技术
  2. 柯里化声称 “如果你固定某些参数,你将得到接受余下参数的一个函数”;

维基百科的结束非常的抽象,我们这里做一个总结:

  1. 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数;
  2. 这个过程就称之为柯里化

图一是柯里化,图二是简化

请添加图片描述

五、柯里化作用 - 让函数的职责单一


        在函数式编程中,我们其实往往希望一个函数处理的问题尽可能的 单一 ,而不是将一大堆的处理过程交给一个函数来处理;那么我们是否就可以将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果;


比如下面的案例我们进行一个修改: 传入的函数需要分别被进行如下处理

  1. 第一个参数 + 2
  2. 第二个参数 * 2
  3. 第三个参数 ** 2
    在这里插入图片描述

其实也就相当于

function add2(x,y,z){x=x+2y=y*2z=z*zreturn x+y+z}

但如果,在处理x,y, z 各有十行代码时?? 柯里化就会让功能清晰

请添加图片描述

六、柯里化作用 - 逻辑的复用

        柯里化还有一大好处就是逻辑的复用,比如以下案例,我想找男朋友,得满足4个条件,当我其中一些要求固定时,可以 定制化 ,进而实现逻辑的复用

function boy(time){...return function (work){...return function (habbi){...return function (type){...}}}}boy('19岁')('前端')('健身')('狼狗')var boy_time=boy('19岁')boy_time('前端')('健身')('狼狗')var boy_B=boy('19岁')('前端')boy_B('跑步')('奶狗')var boy_c=boy('29岁')('后端')('写字')boy_c('奶狗')

七、将多个普通的函数,转成柯里化函数(我没太理解,等我理解了再更)


分析代码:

以上的案例里我都是手动写的函数,

八、理解组合函数

组合(Compose)函数是在 JavaScript 开发过程中一种对函数的使用技巧、模式,比如我们现在需要对某一个数据进行函数的调用,执行两个函数fn1和fn2,这两个函数是依次执行的;那么如果每次我们都需要进行两个函数的调用,操作上就会显得重复; 那么是否可以将这两个函数组合起来,自动依次调用呢?这个过程就是对函数的组合,我们称之为 组合函数(Compose Function);
在这里插入图片描述

九、

刚才我们实现的compose函数比较简单,我们需要考虑更加复杂的情况:比如传入了更多的函数,在调用
compose函数时,传入了更多的参数:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣:54. 螺旋矩阵(Python3)

题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 来源:力扣(LeetCode) 链接:力扣 示例: 示例 1: 输入:matrix [[1,…

SpringBoot 2.1.7.RELEASE + Activiti 5.18.0 喂饭级练习手册

环境准备 win10 eclipse 2023-03 eclipse Activiti插件 Mysql 5.x Activiti的作用等不再赘叙&#xff0c;直接上代码和细节 POM <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>…

Spring-2-透彻理解Spring 注解方式创建Bean--IOC

今日目标 学习使用XML配置第三方Bean 掌握纯注解开发定义Bean对象 掌握纯注解开发IOC模式 1. 第三方资源配置管理 说明&#xff1a;以管理DataSource连接池对象为例讲解第三方资源配置管理 1.1 XML管理Druid连接池(第三方Bean)对象【重点】 数据库准备 -- 创建数据库 create …

SQL力扣练习(十)

目录 1.体育馆的人流量(501) 示例 1 解法一&#xff08;row_number&#xff08;&#xff09;&#xff09; 解法二&#xff08;自定义变量&#xff09; 解法三 2.好友申请&#xff08;602&#xff09; 示例 解法一&#xff08;union all&#xff09; 解法二 3.销售员&…

【架构设计】如何设计一个高性能短链系统

一、前言 所谓系统设计&#xff0c;就是给一个场景&#xff0c;让你给出对应的架构设计&#xff0c;需要考虑哪些问题&#xff0c;采用什么方案解决。很多面试官喜欢出这么一道题来考验你的知识广度和逻辑思考能力。 虽然各个系统千差万别&#xff0c;但是设计思想基本一致&a…

如何识别手机是否有灵动岛(dynamic island)

如何识别手机是否有灵动岛&#xff08;dynamic island&#xff09; 灵动岛是苹果2022年9月推出的iPhone 14 Pro、iPhone 14 Pro Max首次出现&#xff0c;操作系统最低是iOS16.0。带灵动岛的手机在竖屏时顶部工具栏大于等于51像素。 #define isHaveDynamicIsland ({ BOOL isH…

UART实验

一、UART简介 UART Universal Asynchronous Receiver Transmitter 即通用异步收发器&#xff0c;是一种通用的串行、异步通信总线该总线有两条数据线&#xff0c;可以实现全双工的发送和接收在嵌入式系统中常用于主机与辅助设备之间的通信 二、通信基础 - 并行和串行 并行通信…

【JavaEE】Spring Boot - 项目的创建和使用

【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09; 文章目录 【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09;1. Spring Boot 的优点2. Spring Boot 项目创建2.1 下载安装插件2.2 创建项目过程2.3 加载项目2.4 启动项目2.5 删除一些没用的文件 3. Sp…

GCC编译过程:预处理->编译->汇编->链接

目录 引言 概括介绍 一、预处理 二、编译 三、汇编 四、链接 总结 引言 当使用集成开发环境&#xff08;IDE&#xff09;进行C语言编程时&#xff0c;点击"编译"按钮后&#xff0c;整个C程序从源代码到可执行文件的生成过程会自动完成。IDE会在后台为我们执行C…

Jwt(Json web token)——使用token的权限验证方法 用户+角色+权限表设计 SpringBoot项目应用

目录 引出使用token的权限验证方法流程 用户、角色、权限表设计权限表角色表角色-权限关联表用户表查询用户的权限&#xff08;四表联查&#xff09;数据库的视图 项目中的应用自定义注解拦截器controller层DTO返回给前端枚举类型的json化日期json问题 实体类-DAO 总结 引出 1.…

Linux usb设备固定端口号

Linux usb设备固定端口号 一:/sys/bus/usb/devices/二:设备信息三:固定usb设备名方法 一:/sys/bus/usb/devices/ 信息显示如下 1-0:1.0 1&#xff1a;表示 1 号总线&#xff0c;或者说 1 号 Root Hub0&#xff1a;表示端口号1&#xff1a;表示配置号0&#xff1a;表示接口号命…

flink+kafka+doris+springboot集成例子

目录 一、例子说明 1.1、概述 1.1、所需环境 1.2、执行流程 二、部署环境 2.1、中间件部署 2.1.1部署kakfa 2.1.1.1 上传解压kafka安装包 2.1.1.2 修改zookeeper.properties 2.1.1.3 修改server.properties 2.1.1.3 启动kafka 2.1.2、部署flink 2.1.2.1 上传解压f…

SpringBoot项目-个人博客系统的实现【下】

10.实现强制要求登陆 当用户访问 博客列表页和 博客详情页时, 如果用户当前尚未登陆, 就自动跳转到登陆页面 1.添加拦截器 public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletRespon…

根文件系统制作

1.官网下载工具 制作工具&#xff1a;busybox https://busybox.net/downloads/ 2.制作根文件系统 2.1准备工作 a.把压缩包放在FSP1M目录下&#xff0c;并解压 2.2正式开始 2.2.1配置交叉编译工具链 1. 打开Makefile文件 2. 修改ARCH &#xff1f;$(SUBARCH) &#xf…

Yolov5缺陷检测/目标检测 Jetson nx部署Triton server

使用AI目标检测进行缺陷检测时&#xff0c;部署到Jetson上即小巧算力还高&#xff0c;将训练好的模型转为tensorRT再部署到Jetson 上供http或GRPC调用。1 Jetson nx 刷机 找个ubuntu 系统NVIDIA官网下载安装Jetson 的sdkmanager一步步刷机即可。 本文刷的是JetPack 5.1, 其中包…

day03

#ifndef __SEQLIST_H__ #define __SEQLIST_H__#include <stdio.h> #include <string.h> #include <stdlib.h>#define MAX 40 typedef int datatype; typedef struct {datatype data[MAX];int len; }seqlist, *seqlistPtr;//创建顺序表 seqlistPtr list_creat…

vscode连接远程Linux服务器

文章目录 一、环境安装1.1 下载vscode1.2 下载vscode-sever 二、ssh链接2.1 安装Remote-SSH2.2 设置vscode ssh2.3 设置免密登录2.3.1 本地生成公私钥2.3.2 服务器端添加公钥 三、安装插件3.1 vscode安装插件3.1.1 在线安装插件3.1.2.1 下载插件3.1.2.2 安装插件 3.2 vscode-se…

Openlayers实战:判断共享单车是否在电子围栏内

共享单车方便了我们的日常生活,解决了后一公里的行程问题。为了解决共享单车乱放的问题,运营部门规划出一些围栏,配合到电子地图上即为电子围栏,只有放在围栏内才能停车结算,在我们的Openlayers实战示例中,即模拟这一场景。 效果图 源代码 /* * @Author: 大剑师兰特(x…

【Git】Git切换地址

如何切换git代码地址&#xff1f; 1、查看当前远程 url git remote -v执行命令后&#xff0c;可以看见当前有2个URL。 远程 URL 在一般情况下有两个&#xff0c;分别是 fetch 和 push。 fetch URL 是用于从远程仓库获取最新版本的数据。当您运行 git fetch 命令时&#xf…

ThreadPoolExecutor线程池详解

ThreadPoolExecutor线程池详解 1. 背景 项目最近的迭代中使用到了ThreadPoolExecutor线程池&#xff0c;之前都只是知道怎么用&#xff0c;没有了解过线程池的底层原理&#xff0c;项目刚上线&#xff0c;有时间整理一下线程池的用法&#xff0c;学习一下线程池的底层实现与工…