纯函数 和 函数柯里化 ( 函数式编程 )05

news2024/12/26 13:20:47

加油,今天周二啦!😍

文章目录

  • 一、js 的纯函数
  • 二、JavaScript 柯里化
  • 三、柯里化作用
  • 四、将多个普通的函数,自动转成柯里化函数
  • 五、理解组合函数


一、js 的纯函数


  • 函数式编程中有一个非常重要的概念叫纯函数,JavaScript 符合 函数式编程的范式,所以也有 纯函数 的概念
  • 在react开发中纯函数是被多次提及的,比如react中组件就被要求像是一个纯函数

纯函数的维基百科定义:

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

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

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

比如:

  • 数组方法:slicesplice
  • 在调用 slice 时,不会修改原始数据(输入数据)
  • 在调用 splice 时,会修改
    // 这个faz函数是一个纯函数,因为它相同的输入有相同的输入
	let obj={age:100,name:'xia'}
	function faz(text){
		return {
			...text,
			age:18
		}
	}
	faz(obj)

副作用

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

  • 副作用(side effect)其实本身是医学的一个概念,比如我们经常说吃什么药本来是为了治病,可能会产生一些其他的副作用;

  • 在计算机科学中,也引用了副作用的概念,表示 在执行一个函数 时,除了 返回函数值之外 ,还对调用函数产生了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储;

纯函数的优势

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

二、JavaScript 柯里化


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

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

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

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

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

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

请添加图片描述

三、柯里化作用


让函数的职责单一

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

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

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

其实也就相当于


	function add2(x,y,z){
		x=x+2
		y=y*2
		z=z*z
		return 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('奶狗')
      

四、将多个普通的函数,自动转成柯里化函数


分析代码:

  1. 我们来看 hyCurrying , 接收一个函数 fn
  2. 在调用 hyCurrying 时会返回一个函数 curried 并赋值给curryAdd ,
  3. 当再次调入 curryAdd 也就是将我们多个普通函数转化为柯里化
  4. 因为我们再调用curryAdd 的参数长度不确定,这时我们先进行一个判断
  5. 如果 传入的长度和我们要调用函数的长度一样,就说明直接执行
  6. 这里为什么要用apply : 我们要确保this指向为当前函数
  7. 如果传入的长度不一样,我们就需要通过递归的方式,再次去判断和调用长度是否一样

以上的案例里我都是手动写的函数,
请添加图片描述


五、理解组合函数

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

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


请添加图片描述

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

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

相关文章

C++设计模式_08_Factory Method工厂方法模式

文章目录 1. “对象创建模式”模式1.1 典型模式 2. 动机(Motivation)3. 代码演示Factory Method工厂方法模式3.1 常规方法3.2 面向接口的编程3.2.1 FileSplitter1.cpp3.2.2 MainForm1.cpp 3.3 Factory Method工厂方法3.3.1 ISplitterFactory.cpp3.3.2 Ma…

冰河公开了常逛的23大学习网站,赶快收藏

大家好,我是冰河~~ 最近有小伙伴问我:冰河,你有啥好的学习资源或者网站没?分享一下可以吗?这不,我连夜给大家整理了一波,走起~~ 赶快收藏,悄悄努力,然后惊艳所有人&…

睿趣科技:现在开抖音小店到底要多少钱

随着短视频平台的兴起,抖音小店成为了越来越多创业者的选择。那么,现在开抖音小店到底要多少钱呢?这个问题涉及到以下几个方面的费用。 首先,我们需要了解的是,开设抖音小店本身是免费的。你只需要在抖音APP上申请开店&#xff0…

迁移conda环境后,非root用户执行pip命令和jupyter命令报错/bad interpreter: Permission denied

移动conda环境,在移动的环境执行pip和jupyter 报错-bash: /data/home/用户名/anaconda3/envs/llm/bin/pip: /root/anaconda3/envs/llm/bin/python: bad interpreter: Permission denied 报错信息 一、原因 原因是当前的这个data/home/用户名/anaconda3/envs/环境名…

2183440-41-5,138589-19-2,FAM amine, 5-isomer可以与蛋白质或核酸结合

试剂 | 基础知识概述(部分): 【中文名称】FAM-胺,5-异构体 【英文名称】FAM amine, 5-isomer 【CAS】2183440-41-5,138589-19-2 【分子式】C27H27ClN2O6 【分子量】511.0 【Ex】: 490 【Em】: 513 规格标准:10…

文章必备| 叶绿体基因组高级分析内容汇总

叶绿体普遍存在于植物体中,叶绿体基因组是一个典型的双链环状DNA分子,一个植物当中含有多个叶绿体,一个叶绿体中含有12个cpDNA分子。 常见的植物叶绿体基因组大小一般在150-160 kb左右,藻类会略小一些,在80-100 kb左右…

基于RFID技术的烟草供应链数字化管理方案

一、背景介绍 在国家烟草局对烟草行业标准化管理的要求下,工业企业和商业企业纷纷实施烟草编码和扫描,以实现烟草生产和物流过程的跟踪管理。然而,传统的人工管理方法存在工作量大、效率低、错误率高等问题,难以满足现代经济竞争…

Linux下使用openssl为harbor制作证书

openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证…

做好文件外发管理,助力企业安全高效的进行文件共享

信息化时代,考虑到文件传输的便捷和快速,大多采用电子文件的形式完成。电子文档传播性强,但容易被拷贝传输,因此对于发给客户或合作伙伴的重要资料,都需要做好文件外发管理策略,不然随时可能被以明文的形式…

“火焰杯”软件测试高校就业选拔赛获奖名单揭晓,河南工业大学人工智能与大数据学院两名学子上榜,奖金2万元!

10月14日,由大学生软件测试就业联盟主办的“火焰杯”软件测试高校就业选拔赛颁奖典礼在D204会议室隆重举行。我校人工智能与大数据学院软件工程1803班张志成同学夺得决赛一等奖,奖金20000元;软件工程1904班王博伦同学荣获初赛一等奖和决赛二等…

VSCode搭建ESP32 ESP-IDF开发环境-Windows

陈拓 2023/10/09-2023/10/14 1. 安装Windows系统下的ESP32 ESP-IDF开发环境 见《Windows系统安装ESP32 ESP-IDF开发环境》 Windows系统安装ESP32 ESP-IDF开发环境-CSDN博客Windows系统安装ESP32 ESP-IDF开发环境。https://blog.csdn.net/chentuo2000/article/details/1339225…

编程初学者的“愚蠢”代码

每个编程学习者都曾经是初学者,刚起步的时候难免写下一些令人尴尬的、看似愚蠢的代码。这些代码可能充满了错误、逻辑混乱,但它们是学习过程中的一部分。在本文中,我将分享我自己作为初学者时写的一段Java代码,列出问题、分析原因…

springboot+vue基于Spark的共享单车数据存储系统的设计与实现【内含源码+文档+部署教程】

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

分布式链路追踪系统Skywalking的部署和应用

一,背景 随着业务的扩张, 系统变得越来越复杂, 由前端、app、api,微服务,数据库,缓存,消息队列,关系数据库, 列式数据库等构成了繁杂的分布式网络. 当出现一个调用失败的问题时,要定位异常在哪个服务,需要进入每一个服务里看日志, 这个过程的复杂度和工作量是不可想…

蓝屏代码0xc0000001的解决方法和注意事项

蓝屏代码0xc0000001是Windows系统常见的一个错误代码,它通常意味着系统启动时出现了严重的错误。当用户遇到这个问题时,可能会感到非常困惑和焦虑。本文将为大家介绍一些解决蓝屏代码0xc0000001的方法,并详细说明注意事项。让我们一起来看看&…

deepin操作系统下载

官网 最新版本 – 深度科技社区 下载页面 最新版本 – 深度科技社区 随便选择一个下载 直接下载地址 https://cdimage.deepin.com/releases/20.9/deepin-desktop-community-20.9-amd64.iso

IDEA同步代码到Gitee

参考博客 https://gitee.com/jakhyd/risk-operation.git

通达OA通用版V12的表单js定制开发,良好实践总结-持续更新

通达OA通用版V12的表单js定制开发的良好实践总结-持续更新 良好实践总结在表单中的js区域标准代码2023年10月19日获取地址栏:协议、域名/IP地址端口号获取地址栏的参数,比如run_id、flow_id等向表单中追加自定义css、js文件 良好实践总结 在webroot下的…

电脑出现关于kernelbase.dll文件找不到的情况,有什么办法可以解决?

在使用电脑中,突然提示找不到kernelbase.dll,这时候应该怎么办呢?出现这样的问题,有神办法可以解决。看到有小伙伴在问这个问题,那么今天就带大家了解一下这个文件,同时教大家如何解决kernelbase.dll丢失的…

回溯法介绍-回溯与递归的区别【详细且排版舒服】

一、回溯法 1. 定义 有一类问题,我们不知道它明确的计算法则。而是先进行试探,试探到最终状况,发现不满足问题的要求,则回溯到上一个状态继续试探。这种不断试探和回溯的思想,称为回溯法(Back Track Meth…