Scala 05 —— 函数式编程底层逻辑
【摘要】 Scala 05 —— 函数式编程底层逻辑
Scala 05 —— 函数式编程底层逻辑
该文章来自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)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)