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

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

函数式编程 底层逻辑

该文章来自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.mzph.cn/bicheng/573.shtml

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

相关文章

【python】直接在python3下安装 jupyter notebook,以及处理安装报错,启动不了问题

目录 问题: 1 先做准备,查看环境 1.1 先看python3 和pip ,以及查看是否有 juypter 1.2 开始安装 1.3 安装完成后得到警告和报错 2 处理安装的报错问题 2.1 网上有说是因为 pip 自身需要更新,更新之 2.1.1 更新pip 2.1.…

Redis搭建主从

Redis搭建主从: 1:拉取Redis镜像 docker pull redis2:创建主从对应的目录结构 3:对redis6379.log,redis6380.log,redis6381.log进行授权 chmod 777 redis6379.log chmod 777 redis6380.log chmod 777 redis6381.log4:修改主(master)的配置文件 5:创建主(master) redis_6379 …

docker部署java项目,如何docker-compose内的jdk版本与本地版本保持一致

目录结构 /var └── data├── docker-compose.yml └── docker├── Dockerfile└── jdk-8u401-linux-x64.tar.gzdockerfile文件 FROM ubuntu:latest# 拷贝本地服务器上的 JDK 安装包到 Docker 镜像中 COPY jdk-8u401-linux-x64.tar.gz /jdk-8u401-linux-x64.tar.g…

基于弹簧鞘复合纱和迁移学习算法的可穿戴人体重构和智能试衣系统

研究背景 在信息时代和元宇宙的背景下,虚拟服装设计对满足服装行业的个性化需求至关重要。与传统方法不同,虚拟试衣节省时间、方便客户,并提供多样化的款式。准确得测量人体围度并重构出人体的模型是虚拟试衣的关键。为了实现动态人体重构&a…

【面试经典 150 | 二叉树层序遍历】二叉树的右视图

文章目录 写在前面Tag题目来源解题思路方法一:层序遍历方法二:深度优先搜索 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于…

【Linux】进程和计划任务

目录 一、进程介绍 1.1 进程与线程的定义 1.1.1 进程(Process)** 1.1.2 线程(Thread)** 1.1.3 进程与线程的区别 1.2 进程的特征 1.3 进程状态 1.3.1 进程的基本状态 1.3.2 进程更多的状态 1.4 进程的优先级 1.5 进程间通信 1.6 进程的分类* 二、进程管理 2.1 查看…

SpringBoot项目创建及简单使用

目录 一.SpringBoot项目 1.1SpringBoot的介绍 1.2SpringBoot优点 二.SpringBoot项目的创建 三.注意点 一.SpringBoot项目 1.1SpringBoot的介绍 Spring是为了简化Java程序而开发的,那么SpringBoot则是为了简化Spring程序的。 Spring 框架: Spring…

【UKE!】2024.4.19

2024.4.19 【你知道的都是真相。只可惜那些并不是真相的全部。】 Friday 三月十一 谷雨 <BGM “谷雨–音阙诗听”> AC :Answer Coarse,粗劣的答案 ​ CE :Compile Easily,轻松通过 ​ PC :Perfect Compile 完美的编译 ​ WA :Wonderful Answer,好答案 ​ RE :Run Exce…

【InternLM 实战营第二期作业04】XTuner微调LLM:1.8B、多模态、Agent

基础作业 训练自己的小助手认知 1.环境安装 安装XTuner 源码 # 如果你是在 InternStudio 平台&#xff0c;则从本地 clone 一个已有 pytorch 的环境&#xff1a; # pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0studio-conda xtuner0.1.17 # 如果你是在其他平台&#x…

SpringSecurity源码分析3--UserDetail部分

前言&#xff1a;本章提及的类都是与用户名、密码相关的类 UserDetailsService.class 用于加载用户信息 DaoAuthenticationProvider.class 将数据库的信息拿出来进行认证 AbstractUserDetailsAuthenticationProvider.class DaoAuthenticationProvider的父类&#xff0c;通过模…

【FreeRTOS】RTOS任务的同步与互斥:(二)信号量

【FreeRTOS】RTOS任务的同步与互斥&#xff1a;&#xff08;二&#xff09;信号量 信号量概念二值信号量二值信号量概念二值信号量相关API函数二值信号量的案例设计cubeMX配置软件程序设计 计数型信号量计数型信号量概念计数型信号量相关API函数二值信号量的案例设计cubeMX配置…

VUE 页码分页封装

VUE 页码封装组件 pagination/index.vue &#xff1a; <template><div class"pagination-contianer"><el-pagination background layout"prev, pager, next" :total"total" current-change"currentChange"> </e…

点赞列表查询列表

点赞列表查询列表 BlogController GetMapping("/likes/{id}") public Result queryBlogLikes(PathVariable("id") Long id) {return blogService.queryBlogLikes(id); }BlogService Override public Result queryBlogLikes(Long id) {String key BLOG_…

零基础小白如何自学网络安全(入门)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

从数据库中到处所有表的列、注释、类型、是否必填等信息

从数据库中到处所有中文表名、英文表名、所有列、注释、类型、长度、是否必填等信息&#xff0c;效果如下&#xff1a; 要实现上面的表格可以直接用SQL实现&#xff0c;实现SQL如下&#xff1a; #查询SQL select* FROMinformation_schema.COLUMNS as columns left join (sele…

【Jenkins PipeLine】Jenkins PipeLine 联动参数示例

目录 1. Pipeline script&#xff1a; 1.1.代码说明&#xff1a; 2. 实现效果&#xff1a; 3.联动说明&#xff1a; 4.Jenkins安装插件 1. Pipeline script&#xff1a; properties([parameters([[$class: "ChoiceParameter", choiceType: "PT_SINGLE_SELE…

在mini2440上编写linux应用程序、字符设备驱动程序的编写与编译

在mini2440上编写linux应用程序 结合前两篇的学习&#xff0c;一个linux操作系统已经在mini2440上运行起来了&#xff0c;结合交叉编译环境和nfs等工具&#xff0c;我们可以在mini2440上编写任何我们在linux系统编程中学到的应用程序。一个简要的多文件Makefile文件如下&#…

数组*巴巴拉拉

一&#xff0c;数组的定义以及创建方式 数组的作用&#xff1a;数组可以把一组数据的集合存放在单个变量下 创建数组有两种方式&#xff1a; 1.利用new创建数组 var arr new Array() 2.利用数组字面量创建数组(常用) var arr [] 注意点&#xff1a;数组里可以存放任…

2013–2022年福建漳江口互花米草分布无人机遥感数据集

文章目录 摘要数据集内容数据集命名方式数据引用与参考文献引用 摘要 本数据集利用无人机搭载可见光相机&#xff0c;获取福建漳江口湿地2013-2022年期间的航拍影像&#xff0c;通过影像拼接生成整个研究区的正射影像&#xff0c;制作十年尺度的遥感影像数据集及互花米草空间数…

C++初阶学习第一弹——C++入门(上)

前言&#xff1a; 很高兴&#xff0c;从今天开始&#xff0c;我们就要步入C的学习了&#xff0c;在这之前我们已经对C语言有了不错的了解&#xff0c;对数据结构也有了一些自己的认识&#xff0c;今天开始&#xff0c;我们就进入这个新的主题的学习——C 目录 一、C的发展即其特…