Scala 05 —— 函数式编程底层逻辑

news2025/1/16 3:46:32

在这里插入图片描述
在这里插入图片描述

Scala 05 —— 函数式编程底层逻辑

该文章来自2023/1/14的清华大学交叉信息学院助理教授——袁洋演讲。

文章目录

  • Scala 05 —— 函数式编程底层逻辑
      • 函数式编程
      • 假如...副作用是必须的?
      • 函数的定义
      • 函数是数据的函数,不是数字的函数
      • 如何把业务逻辑做成纯函数式?
      • 函数式编程是声明式的,有效解耦
      • 把业务逻辑看成流水线

函数式编程

  • 什么是函数式编程?

    • y=f(x)
  • 无副作用:

    • y只是依赖x,不会依赖其他变量
    • 确定性关系:重新跑100次代码,得到的结果是一样的
    • 不会给世界带来副作用。算完f(x)然后就得到了y,其他什么都没变。
  • 什么是副作用?

    • 读写数据,人机交互,网络传输等等…本不应该出现在函数式编程中,它们可能会带来"脏东西"或不确定因素。

假如…副作用是必须的?

  • 把脏东西推到边缘去

    • 在代码核心使用纯函数式编程(无副作用)
      • 加减乘除求和等等…
    • 在代码边缘处做其他任务(有副作用)
      • 写数据库、与服务器通信、获取数据等等
        请添加图片描述
  • 有什么好处?

    • 至少我们对于代码核心能有更好的论证
    • 纯的函数式代码到底有多大好处?
  • 核心代码块一定要大!

    • 不应该只是min(x,y)

    • 不应该只是List(12,3,4,5,6),map(a=>a*a)

函数的定义

  • 函数式编程,函数的输入输出必须有清晰定义

    • 输入是什么,输出是什么?
    • 输入有哪些变量,它们分别是什么?
  • 定义模糊的例子:

    • y=f(x,y,?) :第三个参数可能不存在

    • 这种做法就不够函数式,因为它同时定义了

      • y=f(x,y,z)
      • y=f(x,y)
    • 但是可以这么写:y=f(x,y,z=null)

      • f有三个参数,第三个默认为null

函数是数据的函数,不是数字的函数

  • 基本类型的操作用的不多

  • 稍复杂的业务会涉及到更多自定义数据类型

  • 函数可以看作是一个范畴到另一个范畴直接的映射,即函子

  • 什么是范畴?

    • 范畴就是带有关系的集合
      • 有很多对象,对象与对象之间有关系
      • 可以表示世界万物
  • 函数式编程在范畴之间跳来跳去,函数式编程以范畴论为理论基础

  • 如何定义范畴?

    • 常用方法:OOP
  • OOP和FP是否矛盾?

    • 一个是操作对象

    • 一个是操作内容

    • 需求:实现从猫到狗的转变

      请添加图片描述

  • OOP和FP是互补的,相互结合的

    • OOP定义范畴内部的关系
    • FP定义范畴与范畴之间的关系
    • 两者垂直互补

如何把业务逻辑做成纯函数式?

  • 业务流程中的每个中间步骤的数据必须是良定义的(adj.的n.)
  • 数据与数据之间的转换过程是确定性的。(A->…操作->B)

请添加图片描述

函数式编程是声明式的,有效解耦

  • 声明式:我告诉你,我给你什么(输入),我要什么(输出),你怎么做的我不管

    • API接口给定,实现你做,我之后会来测试
  • 描述的不是一个业务需求,而是对象转换

    • 适合代码复用
  • 把一个长链条拆分成无数小的步骤

    • 每个步骤都比较简单(函数式),容易验证
  • 关注输入输出的对象而非过程,容易做到类型安全的严丝合缝

  • 函数式编程的理想步骤:
    1.定义业务逻辑中所有的数据格式
    2.定义所有数据与数据的转换操作函数
    3.根据业务逻辑要求,把函数串起来

  • 先定框架,再定逻辑

    • 是什么
    • 为什么
    • 怎么做
  • 实现会变得很容易,更适合AI自动编程

把业务逻辑看成流水线

  • 每个函数都是流水线的一环
  • 每一环都会将产品(数据)加工成另一个数据
    • 猫变成狗
  • 尽量不使用全局变量
    • 流水线上不会调用流水线之外的东西帮忙
  • 不要使用var,使用val
    • 函数式编程中没有变量,只有指代
    • 变量是实现的方式,但不是业务逻辑本身
    • 从范畴的角度很容易理解
  • 先做对,再做快:因为效率导致的问题通常很容易被修复

全局变量

  • 流水线上不会调用流水线之外的东西帮忙
  • 不要使用var,使用val
    • 函数式编程中没有变量,只有指代
    • 变量是实现的方式,但不是业务逻辑本身
    • 从范畴的角度很容易理解
  • 先做对,再做快:因为效率导致的问题通常很容易被修复
    在这里插入图片描述

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

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

相关文章

ELK创建仪表盘

创建仪表盘步骤: 一、保存search二、生成饼图三、创建仪表盘 一、保存search 首先保存一段时间内的search,可以添加想要的字段,并保存这个search方便下次直接打开该search,并方便在可视化和仪表盘中使用该search. 二、生成饼图…

基于JAVA高考志愿辅助填报系统

当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统高考志愿辅助填报采取了人工的管理方法&#xf…

销帮帮CRM与电商运营增效的关系?

在电商运营中,不同部门之间往往存在信息壁垒,导致客户体验的不连贯。销帮帮CRM通过提供跨职能管理客户关系的共享平台和一体化工作流引擎,使员工能够使用正确的工具和数据更有效地管理跨业务线的客户关系,实现更互联的客户体验。这…

相亲平台app小程序

相亲平台app小程序是一种基于手机应用的微型程序,专为在线相亲交友活动设计。它提供了一系列的功能,旨在帮助用户更方便、更高效地找到心仪的伴侣。 首先,用户可以在个人资料部分上传照片、填写个人资料、设置兴趣爱好等信息,以便…

前端-vue项目debugger调试

一、前言 有的时候接受同事一个项目,用框架不一样,写的也不太规范,那么就需要打断点去学习改项目的流程了。 那么vue项目是如何debugger调试呢? 二、操作 大概理解一下,vue项目启动,大概是先启动框架&am…

【Web】DASCTF X GFCTF 2024|四月开启第一局 题解(全)

目录 EasySignin cool_index SuiteCRM web1234 法一、条件竞争(没成功) 法二、session反序列化 EasySignin 先随便注册个账号登录,然后拿bp抓包改密码(username改成admin) 然后admin / 1234567登录 康好康的图片功能可以打SSRF,不能直接读本地文…

T2T时代的基因组组装-文献精读-9

Genome assembly in the telomere-to-telomere era T2T时代的基因组组装,李恒大神的综述,昨天刚出刊,李恒也是samtools、seqtk等的核心作者。 seqtk安装与使用-seqtk-1.4(bioinfomatics tools-012) Samtools安装与…

DMAIC助力企业迅速响应客户诉求——客诉回复周期大缩减

近年来,客户的声音宛如企业的风向标,不容忽视。迅速而精准地回应客户的投诉,不仅是对品牌形象的捍卫,更是滋养客户满意度和忠诚度的甘泉。那么,我们如何借助DMAIC这一久经考验的质量管理法宝,来缩短客户投诉…

jdk版本冲突,java.lang.UnsupportedClassVersionError: JVMCFRE003

主要是编辑器所用的jdk版本和项目用的不一致导致的,虽然编译通过了,但是运行是会报错 选好后点击Apply点击ok,然后重新编译一遍项目就可以了

Python 全栈体系【四阶】(三十一)

第五章 深度学习 五、PaddlePaddle 基础 1. PaddlePaddle 简介 1.1 什么是 PaddlePaddle PaddlePaddle(Parallel Distributed Deep Learning,中文名飞桨)是百度公司推出的开源、易学习、易使用的分布式深度学习平台 源于产业实践&#xf…

Java基本语法(基础部分)

Java基本语法 文章目录 Java基本语法前言一、准备工作1.1 计算机软件与硬件1.2 计算机编程语言1.3 Java语言概述&程序分析1.4 Java环境搭建&Java API1.5 Java核心机制JVM 二、变量2.1 关键字&标识符2.2 变量2.3 数据类型(基本数据类型)2.3.1 基本数据类型2.3.2 基本…

【ONE·基础算法 || 递归 二叉树深搜】

总言 主要内容:编程题举例,熟悉理解递归类题型,进一步加深理解深搜,引入回溯和剪枝相关概念。       1、递归 1)、递归   实际在学习语言中我们对其有一定涉及。这里,若从宏观视角看待递归的过程&am…

30个数据工程中最常用的Python库(下)

六、数据解析和ETL库 库:beautifulsoup4 数据工程并不总是意味着从数据存储和仓库中获取数据。通常,数据需要从非结构化的来源(如网络或文档等)中提取出来。Beautiful Soup是一个库,它可以轻松地从网页上抓取信息。它…

互联网营销两大宗师:周鸿祎和雷军做个人IP有什么不同?

前几天周鸿祎说要把自己的迈巴赫卖了,准备换国产新能源,还喊话让各个车企给他送车去体验。不少车企都送去了自己的最新车型,只有雷军直接回答,“等SUV出”。我们是在吃瓜,作者却是从中看到了新老营销宗师的手法不同。 最近,在纪念互联网30周年的座谈会上,发生了一件趣事…

高级控件4:Spinner

Spinner下拉列表组件 主要集合ArrayAdapter、SimpleAdapter以及自定义的Adapter(继承自BaseAdapter)配合使用实现下拉选择或者对话框中选择某一条目。下拉使用的更多,所以,接下来的案例也会重在演示下拉效果。 本次基本就是上代…

亚马逊运营干货:多账号多店铺防关联技巧

随着亚马逊识别技术的提升,以及政策的加强,不少跨境电商的卖家都面临着多账号多店铺被关联的风险,这个时候,卖家就需要做好相关的防关联措施了,下面这些方法很有效,可以去参考! 亚马逊多账号多…

如何在Windows服务做性能测试(CPU、磁盘、内存)

目录 前言1. 基本知识2. 参数说明 前言 由于需要做一些接口测试,测试是否有真的优化 1. 基本知识 该基本知识主要用来用到Performance Monitor,以下着重介绍下这方面的知识 性能监视器(Performance Monitor):Windo…

VUE的import store from ‘./vuex/store改为‘ import store from ‘./vuex/store.js‘

ERROR Failed to compile with 1 error 下午5:25:40 error in (webpack)-dev-server/client?http://10.18.173.180:8081/sockjs-node Syntax Error: no such file or directory, open D:\4myroom\H…

C++面向对象程序设计 - 运算符重载

函数重载就是对一个已有的函数赋予新的含义,使之实现新的功能。因此一个函数名就可以用来代表不同功能的函数,也就是一名多用。运算符也可以重载,即运算符重载(operator overloading)。 一、运算符重载的方法 运算符重…

DFS与回溯专题:二叉树的最大深度

DFS与回溯专题:二叉树的最大深度 题目链接: 104.二叉树的最大深度 题目描述 代码思路 设置两个变量,max来记录最大值,sum来记录路径的节点数量。利用dfs对二叉树进行搜索,遇到节点,则sum1;遇到叶子节点&…