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

news2025/4/27 17:28:57

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

函数式编程 底层逻辑

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

文章目录

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

函数式编程

  • 什么是函数式编程?

    • 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/1608279.html

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

相关文章

Oracle数据库的简单使用

Oracle简单使用 一、数据库的介绍二、Oracle介绍账号管理Oracle的安装Oracle服务的作用OracleRemExecService服务创建数据库 常用命令 三、SQL语言SQL分类实用的数据表添加注释数据操纵语言(DML)查询语句(SELECT)wherelikedistinc…

UWB人员定位系统适用的场景有哪些?​​​​​​​10厘米工业级实时轨迹高精度定位

UWB人员定位系统适用的场景有哪些?10厘米工业级实时轨迹高精度定位 一、应用场景 1、商场与零售领域:商场可以使用UWB人员定位系统来跟踪顾客的行踪,以收集顾客行为数据,为营销策略提供有力支持。帮助商场优化商品布局和陈列&…

【鸿蒙开发】生命周期

1. UIAbility组件生命周期 UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。 UIAbility生命周期状态 1.1 Create状态 Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中…

了解 Python 底层的解释器 CPython 和 Python 的对象模型

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、CPython CPython 是 Python 编程语言的官方和最广泛使用的实现。它是用 C 语言编写的,因此得名 “CPython”。作为 Python 生态系统的核心,了解 CPython 的工作原理、主要特…

数据结构- 顺序表-单链表-双链表 --【求个关注!】

文章目录 一 顺序表代码: 二 链表单链表双向链表 一 顺序表 顺序表是线性表的一种 所谓线性表指一串数据的组织存储在逻辑上是线性的,而在物理上不一定是线性的 顺序表的底层实现是数组,其由一群数据类型相同的元素组成,其在逻辑…

bug(警告):[vue-router] Duplicate named routes definition: …

查看警告:[vue-router] Duplicate named routes definition——翻译[vue-router]重复命名路由定义 小编劝诫:当我们在开发过程中警告也一定不要忽略,虽然你在本地跑代码时这些警告影响项目的正常运行,但是会让你产生误区&#xff…

【MIT6.824】lab2C-persistence, lab2D-log compaction 实现笔记

引言 lab2C的实验要求如下 Complete the functions persist() and readPersist() in raft.go by adding code to save and restore persistent state. You will need to encode (or “serialize”) the state as an array of bytes in order to pass it to the Persister. Us…

《游戏系统设计十二》灵活且简单的条件检查系统

目录 1、序言 2、需求 3、实现 3.1 思路 3.2 代码实现 4、总结 1、序言 每个游戏都有一些检查性的任务,在做一些判断的时候,判断等级是不是满足需求。 比如如下场景:在进入副本的时候需要检查玩家等级是否满足,满足之后才…

配置linux的oracle 21c启停服务

一、配置启停 1、使用root用户登陆 su - root 2、修改oratab文件 修改oratab文件,将红框里面的N改为“Y”,使启停脚本能够生效 vi /etc/oratab 3、验证 配置好后就能够使用 dbshut 停止服务 和 dbstart 启动服务 了 2.1启动服务 su - oracle dbstart…

现代商业中首席人工智能官(CAIO)的角色与影响

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Spark01

Spark01 一. Spark概述二. Spark环境部署 - Local三. Spark环境部署 - Standalone1. Standalone集群概述2. Standalone环境部署3. 测试环境 四. Spark环境部署 - Standalone-HA1. 安装部署Zookeeper1. 下载2. zookeeper安装3. 配置StandAlone-HA集群 五. Spark On YARN -- 重点…

深入挖掘C语言 ---- 文件操作

目录 1. 文件的打开和关闭1.1 流和标准流1.1.1流1.1.2标准流 1.2 文件指针1.3 文件的打开和关闭 2. 顺序读写3. 随机读写3.1 fseek3.2 ftell3.3 rewind 4. 读取结束判定 正文开始 1. 文件的打开和关闭 1.1 流和标准流 1.1.1流 我们程序的数据需要输出到各种外部设备, 也需要…

小白也能看懂的BEV感知技术(二)

1. 引言 在自动驾驶的领域中,BEV(Birds Eye View,鸟瞰图)感知技术扮演着至关重要的角色。它允许自动驾驶车辆从上帝视角“看到”周围的环境,就像一只鸟从空中俯瞰地面一样。这项技术对于理解车辆周围的复杂场景至关重…

【Linux系统】地址空间 Linux内核进程调度队列

1.进程的地址空间 1.1 直接写代码&#xff0c;看现象 1 #include<stdio.h>2 #include<unistd.h>3 4 int g_val 100;5 6 int main()7 {8 int cnt 0;9 pid_t id fork();10 if(id 0)11 {12 while(1)13 {14 printf(&…

javaagent使用

Java Agent是什么&#xff1f; Java Agent是Java平台提供的一个强大工具&#xff0c;它可以在运行时修改或增强Java应用程序的行为。是在JDK1.5以后引入的&#xff0c;它能够在不影响正常编译的情况下修改字节码&#xff0c;相当于是在main方法执行之前的拦截器&#xff0c;也叫…

Python | Leetcode Python题解之第32题最长有效括号

题目&#xff1a; 题解&#xff1a; class Solution:def longestValidParentheses(self, s: str) -> int:stack[]maxL0nlen(s)tmp[0]*n #标记数组cur0for i in range(n):if s[i](:stack.append(i)else:if stack:jstack.pop()if s[j](:tmp[i],tmp[j]1,1 #匹配成…

【C++】:C++关键字,命名空间,输入输出,缺省参数

目录 一&#xff0c;C关键字(C98)二&#xff0c;命名空间2.1 命名冲突2.2 关键字namespace2.2.1 命名空间中可以定义变量/函数/类型2.2.2 命名空间可以嵌套2.2.3 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 2.3 命名空间的使用2.3.1 指定…

多模态AnyGPT——整合图像、语音和文本多模态大规模语言模型算法原理与实践

概述 大规模语言模型在理解和生成人类语言方面具有非凡的能力&#xff0c;但迄今为止&#xff0c;它们的能力主要局限于文本处理。然而&#xff0c;现实世界是一个多模式的环境&#xff0c;信息通过视觉、听觉和触觉等多种感官进行交换。融入这种多样性是开发下一代系统的主要…

桥接模式【结构型模式C++】

1.概述 桥接模式是一种结构型设计模式&#xff0c;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&am…

高斯溅射融合之路(一)- webgl渲染3d gaussian splatting

大家好&#xff0c;我是山海鲸的技术负责人。之前已经写了一个GIS融合系列。其实CesiumJS的整合有相当的难度&#xff0c;同时也有很多方面的工作&#xff0c;很难在几篇文章内写完&#xff0c;整个山海鲸团队也是投入了接近两年的时间&#xff0c;才把周边整套工具链进行了完善…