OOP和函数编程的区别
表格:行是operation,列是variant
函数编程:
     每个operation都是一个函数,每个函数都有若干branch,每个branch都对应一个variant
     定义datatype,每个variant都对应一个constructor
面向对象编程:
     定义一个基类,每个operation是一个类函数,基类中的函数是抽象的
     每个variant是一个子类,并且实现所有的抽象函数
问题一:如果有函数带有多种类型的参数?
函数编程:
    通过wildcard pattern + helper function + case语句
面向对象编程:
     Double Dispatch
Double Dispatch
将需要知道对方的类 转化成 调用对方的函数
第一次分配:variant类应该知道自己如何做一个operation=>如Int类型就应该调用arg.add_int(self)
第二次分配:对方的add_int知道应该如何将自己和int相加
调用栈:
     add(a, b)
     a.add_values(b)
     b.add_A的类型(a自己)
     b正确处理
Multiple Dispatch
每个add_values都有自己对应的参数类型,类里会有多个add_values
当调用a.add_values(b),将会在运行时挑选出A中接收B类型的参数的add_values, 直接调用
注意:Java和C++的static overloading虽然也能根据参数类型挑选对应函数,但是是编译期决定的,并不是运行时决定的。
多重继承:可能会在fields和methods上有冲突
     C++是支持多重继承的+abstract method
     Ruby运行有一个直接的基类和多个mixin
     Java支持一个直接的基类和实现多个接口
Mixin
类似接口,类能include mixin, 但是不能直接实例化mixin。
minxin不能有instancevariable
定义:module M … end
使用:class A < B
               include M
          end
Ruby自带的mixin: Enumerable(实现each方法)和Comparable(实现<=>方法)
     
Abstract method和high-order function的相同之处
     都可以先定义一个框架,由client实现其中的细节。
     Abstract method是通过override函数实现的
     High-order function是通过传入函数实现的
Polymorphism:
ML中:parametric polymorphism / generics
Ruby中:subtype polymorphism / subtyping
Generic和Subtyping:
     Generic适用于 可以是任何类型的参数,但必须是同一个类型 的情况
     Subtyping适用于 有extra fields的对象的代码重用 的情况
Bounded Polymorphism:
     Generic + Subtyping
     对于depth subtype如List,可以使用List<T extend A>,这样可以修改List的内容,替换成其他的T,但是注意,都是同类型的。
Subtyping:
     让一个类型{f1:t1, f2:t2...}也是类型{f2:t2…}。前者是subtype,subtype拥有更多的信息。
     t1 <: t2: t1是t2的subtype。
     如果e是t1,那么e也是t2。t2可以理解成父类,t1是子类,子类能拥有更多的field,且子类是基类
     任何使用t2的地方都可以使用t1(t1是t2,但是t2未必是t1)
     Depth subtyping:
          如果t1<:t2, 不能让 t3 : {f1:t1} <: t4 : {f1:t2} 
          原理:如果有函数将x.f1 = t2,那么就会造成t3.f1 = t2。但是如果通过t3.f1去取t1比t2多出来的fields就会报错。
                     当有赋值的时候,depth subtyping就会出现field丢失的情况
                     因此Java禁止赋值一个t1类型的数组内容为t2,但是允许depth subtyping
                     所有类型都可以看做是Null的subtype,所以Java中也会在运行时检查Null
      Function subtyping:不是如何调用函数,而是函数本身的委托
          如果 ta <: tb,则函数t->ta <: t->tb。能返回更多fields(promise more)的函数可以替换。return type: covariant(works the same way)
          如果 ta <: tb,则函数tb->t <: ta->t。需要更少fields(need less)的函数可以替换。argument type: contravariant(works the oposite way)
          除了self/this这个参数,由于实现问题必须是subtype,不能使contravariant的
     OOP中的subtype:
          因为field能够修改,所以subtype的field类型不能改变(原因参照depth subtyping)
          因为methods不能修改,所以subtype的methods能够使用supertype对应函数的subtype     
     Subclass和subtype不同:
          class:定义了对象的行为,子类通过继承并extend/override这些behavior
          type:定义了对象的类型和能够响应的消息,子类型是为了替换父类型并且防止发生错误。

part 8: comparison between OOL and FL相关推荐

  1. Comparison of Laser SLAM and Visual SLAM

    Comparison of Laser SLAM and Visual SLAM 目前,SLAM技术广泛应用于机器人.无人机.无人机.AR.VR等领域,依靠传感器可以实现机器的自主定位.测绘.路径规划 ...

  2. sklearn FutureWarning: numpy not_equal will not check..., The comparison did not return the same

    1. 问题 import sklearn 后有如下警告 ubuntu@test:/data/# python Python 2.7.12 (default, Nov 12 2018, 14:36:49 ...

  3. 【C++】C++11 STL算法(六):最小/最大操作(Minimum/maximum operations)、比较运算(Comparison operations)

    目录 最小/最大操作(Minimum/maximum operations) 一.max 1.原型: 2.说明: 3.官方demo 二.max_element 1.原型: 2.说明: 3.官方demo ...

  4. [转]ISTQB FL初级认证考试资料(中文)

    [转]ISTQB FL初级认证考试资料(中文) 2015-06-22 ISTQB作为一个专业的提供软件测试认证的机构,得到了全球软件测试人员的认可.目前中国有越来越多的人已经获得或者希望获得ISTQB ...

  5. android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题

    android  java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题 jav ...

  6. Comparison of long-read sequencing technologies in the hybrid assembly of complex bacterial genomes

    Comparison of long-read sequencing technologies in the hybrid assembly of complex bacterial genomes ...

  7. 从 Comparison/Converter 到Func 的进化

    本篇文章给大家介绍两个在.net2.0 中就已经出现的, 很"老"的委托方式. 通常情况下, 我们在Array 和 List<T> 类中使用这些功能. 明白用法和作用可 ...

  8. FL计算机软件,FL Studio12水果音乐制作软件

    FL Studio12水果音乐制作软件是一款知名的音乐编曲制作软件,FL Studio 11在中国大家习惯性叫水果软件,它让你的计算机就像是全功能的录音室,大混音盘,非常先进的制作工具,让你的音乐突破 ...

  9. 【 Notes 】COMPARISON OF BASIC METHODS AND POSITIONING SYSTEMS

    目录 COMPARISON OF BASIC METHODS AND POSITIONING SYSTEMS CONCLUSION, SUMMARY, AND FUTURE APPLICATIONS ...

最新文章

  1. Display Substring
  2. oracle mseq,一次RMAN备份报错的诊断过程(一)
  3. 计算机图片处理器,光学图像处理器
  4. vue3.0中使用echarts
  5. 多仓库带扫描进销存系统(仿电商ERP管理系统源码+数据库)
  6. 千锋深圳Java培训分享:MySQL详细知识点
  7. 荒野行动pc版服务器无响应,荒野行动PC版闪退怎么办 电脑版闪退解决方法
  8. 用 JavaScript 和 HTML 制作一个计算器
  9. android 读写文件 简书,Android写入txt文件并读取
  10. Python系列01|可视化生成200个优惠券呀~
  11. 华为OD机试(A、B卷)、机考,200分的题目整理如下,冲满分必备
  12. IKanalyzer 分词器(???)
  13. 音视频开发(三十二):GPUImage高斯模糊的实现与优化
  14. windows下内存检测工具
  15. MCMC实现——Python安装+Anaconda+PYMC3
  16. mmdetection运行demo出现 no attribute ‘__version__‘
  17. 2D - 2D 点对 求解基础矩阵 F 本质矩阵E 单应矩阵 H 进而求 旋转矩阵 R 和 t
  18. 达梦数据库DM7数据过滤迁移,达梦数据库导入导出
  19. 旭日图(echarts)
  20. PAT乙级 1044 火星数字 (20分)

热门文章

  1. python小黄猫--经纬度转换为坐标系x,y
  2. Unity移动端游戏性能优化简谱之 以引擎模块为划分的CPU耗时调优
  3. 利用Python做一个简单的打印店计费程序
  4. strstr()函数c++代码实现实例及运行结果
  5. ULTRON — 360基于Flink的实时数仓平台
  6. elementUI container布局不生效解决办法
  7. 数据读取与数据扩增理解
  8. 谷歌工程师薪资有多少 羡慕嫉妒恨
  9. java swing人机对战五子棋(含背景音乐)
  10. 27. Spark : org.apache.spark.sql.AnalysisException: Reference 'XXXX' is ambiguous