Scala 05 —— 函数式编程底层逻辑
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.根据业务逻辑要求,把函数串起来
-
先定框架,再定逻辑
-
-
- 范畴就是带有关系的集合
-
- f有三个参数,第三个默认为null
-
-
-
- 在代码核心使用纯函数式编程(无副作用)
-
- 读写数据,人机交互,网络传输等等…本不应该出现在函数式编程中,它们可能会带来"脏东西"或不确定因素。
-
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!






