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

2024-04-23 1082阅读

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

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

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

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

文章目录

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

        函数式编程

        • 什么是函数式编程?

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

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

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

                假如…副作用是必须的?

                • 把脏东西推到边缘去

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

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

                      • 有什么好处?

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

                          • 不应该只是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是否矛盾?

                                              • 一个是操作对象

                                              • 一个是操作内容

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

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

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

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

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

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

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

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

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

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

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

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

                                                          • 函数式编程的理想步骤:

                                                            1.定义业务逻辑中所有的数据格式

                                                            2.定义所有数据与数据的转换操作函数

                                                            3.根据业务逻辑要求,把函数串起来

                                                          • 先定框架,再定逻辑

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

                                                              把业务逻辑看成流水线

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

                                                                      全局变量

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

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]