Programming Languages PartC Week3学习笔记——子类型(Subtyping)的讨论

2023-05-16

文章目录

      • Subtyping From the Beginning
      • The Subtype Relation
      • Depth Subtyping
      • Optional: Java/C# Arrays
      • Function Subtyping
      • Subtyping for OOP
      • Generics Versus Subtyping
      • Bounded Polymorphism
      • ***Summarizing All We Have Learned

Subtyping From the Beginning

image-20220713153744219

需要一种包含可修改fields的records,并且具有type system,支持subtyping的语言。我们学过的多种语言都不符合这种要求,因此需要我们自定义一种语法(假定一种语言语法)。

image-20220713154023854

image-20220713154528859

image-20220713155015676

image-20220713155255584

根据上述语法规则,下面的程序(类似子类应用在父类的场合)不会通过类型检测,因为type system此时会认为c不符合p的类型。这是不合理的,因为我们调用distToOrigin时不会用到color这个额外的field。

image-20220713155727926

尽管我们不希望拥有错误field的类型变量被调用(应该在type checking时阻止),但也不应该阻止额外的field。

subtyping是实现这种想法的优雅手段。

image-20220713160853321

The Subtype Relation

为了解决上一节的问题,我们需要在我们的语法规则中增加两条新的规则,一是subtyping的语法,二是新的类型检测规则。(但蓝字部分是唯一需要添加到类型规则中的部分)

image-20220713162133928

subtype不是一种Option

image-20220713162834695

subtype需要遵守的四个规则:

  • 宽度:超类型拥有具备相同类型的子类型fields的子集
  • 可排列性:超类型拥有的field子集元素可以是不同顺序
  • 传递性:子类型可传递
  • 自反性:任何type都是自己的子类

image-20220714103507519

Depth Subtyping

image-20220715111058528

sphere显然不是circleY要求的参数的子类型,除非去掉其中的r,或者去掉center。但这不是我们想要的方式。很自然的想法是,我们可以添加新的规则,当record中某个field是子类型时(所有fields值都必须是子类型(注意子类型的自反性)),这个record也是子类型。这种方式叫做深度subtyping,有点类似C++的深拷贝的思想。

image-20220716195040033

但这种做法不值得我们去实现,因为它打破了稳定性soundness。

image-20220716195816978

image-20220716200002946

如果field不能修改,那么depth subtyping就是稳定的。

image-20220716201415592

Optional: Java/C# Arrays

Java或者C#中,如果t1是t2的子类型,那么t1的数组也是t2的数组的子类型。这与上一节的depth subtyping类似,也会造成问题。

image-20220716201833993

为什么允许这样的操作

image-20220716202937193

image-20220716203443771

null可以为一些不存在的对象或方法兜底,就像ML中的Option(其中的None)

image-20220716204105096

Function Subtyping

对于函数本身,如果具有subtyping的特性

image-20220717113332541

例子:

image-20220717113518731

新的规则,如果函数返回值是子类型,函数是子类型

image-20220717113804236

但如果函数参数是子类型,函数本身不应该是子类型,否则不稳定。这里值得注意的是,因为子类型会比超类型多出来一些field,所以才会导致函数子类型不稳定。

image-20220717114031695

假如参数本身是超类型(少一些field),那么函数反而可以构成稳定的子类型

image-20220717114521659

上述稳定的规则可以同时使用

image-20220717114753112

image-20220717114920785

这一节最后强调contravariant in argument的时候老师好可爱O(∩_∩)O哈哈~

Subtyping for OOP

image-20220718110254647

image-20220718110542451

image-20220718111109784

类和类型的区别:

image-20220718111424532

image-20220718111800605

image-20220718111956551

Generics Versus Subtyping

泛型与子类型

泛型擅长的:

image-20220719100700943

image-20220719100933654

子类型不擅长作为类型”容器“,向下转型是个问题:

image-20220719101139295

子类型擅长的:

image-20220719101553208

对于没有子类型的语言,向函数传递不同的getter和一个泛型来实现子类型的功能

image-20220719101722885

Bounded Polymorphism

混合多态,将泛型和子类型混合使用

image-20220719102138775

例子:

image-20220719102340742

image-20220719102507024

image-20220719103004511

image-20220719103105528

image-20220719103426671

***Summarizing All We Have Learned

总结全部课程内容

首先是课程目标:

image-20220720155832923

我们学到的内容:

image-20220720155916532

几种语言的对比:

image-20220720160009743

要点总结:

其一 是不可修改的好处:

image-20220720160228581

其他要点:

image-20220720160438285

image-20220720160708274

学以致用:

image-20220720160846504

最后就是本课程的saying goodbye环节。整个课程学下来收货还是很多的,函数式编程确实开阔了眼见,也学到了很多程序语言设计和编程哲学,很感谢Dan Grossman老师。

image-20220720161501456

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Programming Languages PartC Week3学习笔记——子类型(Subtyping)的讨论 的相关文章

  • 斜率K的意义

    夹角公式 设直线l1 l2的斜率存在 xff0c 分别为k1 k2 xff0c l1到l2的转向角为 则tan 61 k2 k1 xff09 1 43 k1k2 xff09 l1与l2的夹角为 xff0c 则tan 61 k2 k1 xff
  • 阿里巴巴 2014校招 研发工程师 笔试

    刚杭州这边阿里巴巴校招笔试回来 回忆一下题 xff0c 为大家将来的笔试做点准备 选择题 xff1a 1 字符串 alibaba 的huffman编码有几位 2 以下哪些用到贪婪算法 xff1a 最小生成树的Prim算法最小生成树的Krus
  • Bag of Words(词袋模型)

    词袋模型的提出是为了解决文档分类 xff0c 主要应用在 NLP Natural Language Process xff0c IR Information Retrival xff0c CV xff08 Computer Vision x
  • 全向和定向天线区别,何为天线增益

    文 白浪 为什么网络信号弱 速率低 时断时续 xff1f 为什么购买了大量的AP xff0c 但是还有地方信号不好 xff0c 而有的地方信号多到互相干扰 xff1f 为什么布置了大增益的天线 xff0c 结果还未能得偿所愿 xff1f 无
  • 2017电赛国赛可见光定位装置(精确度达到1cm)

    先不多说上源码 Github网址 xff1a https github com DerrickRose25 Indoor positioning of visible light 用的畸变摄像头 xff0c 用Matlab做线性拟合和畸变矫
  • 如何给图片添加黑色边框

    有时候图片有了黑色边框才能与相近的背景区分开 xff0c 这个时候给图片添加边框就是必须的了 你好这位朋友 xff01 很简单 xff0c 要这样操作 xff1a 将照片打开 xff0c 裁切好后 xff0c 应用工具箱中的矩形选择工具 x
  • STLINK怎么与STM32单片机连接

    STLink是ST官方开发的单片机仿真工具 xff0c 可以烧写程序 在线仿真 xff0c 使用非常方便 STLink具有两种接口 xff0c 分别为 1 SWD模式 2 SWIM单总线模式 SWD模式主要针对STM32系列的单片机 xff
  • 【树莓派4B为例的树莓派接口认识】

    1 xff1a SOC芯片 树莓派采用博通 xff08 Broadcom xff09 BCM2711芯片作为SOC芯片 xff0c 芯片上集成了CPU GPU DSP及SDRAM内存等 xff0c 其中CPU和GPU共享内存 xff0c 可
  • 仿真阿克曼小车+3D激光雷达velodyne并使用lego-LOAM与octomap建图

    仿真的学习内容基于以下项目 xff0c 然后将2D激光雷达换成3D的velodyne试了试效果 xff0c 想跑lego loam然后用octomap转成2D栅格地图看能不能导航 阿克曼小车仿真开源 首先需要下载当前ros版本的velody
  • 树莓派3B安装Ubuntu 18.04

    这里展示的是使用显示器的方法 xff0c 不用ssh 树莓派3b安装Ubuntu18 04完全遵照的Ubuntu wiki中的步骤 如果产生显示器显示问题可以看树莓派与电视之间的显示问题 xff08 1 xff09 下载并写入 下载Ubun
  • ls-remote --tags --heads git://github.com/adobe-webplatform/eve.git

    报错日志 leepandar 64 localhost ant design vue jeecg yarn install yarn install v1 22 19 1 4 x1f50d Resolving packages 2 4 x1
  • python遇到‘\u’开头的unicode编码

    web信息中常会遇到 u4f60 u597d 类型的字符 首先 u 开头就基本表明是跟unicode编码相关的 xff0c u 后的16进制字符串是相应汉字的utf 16编码 python里decode 和encode 为我们提供了解码和编
  • gVim配色和字体选择

    本文简述如何跟换gVim的字体和选择喜欢的配色方案 xff1a 1 下载配色方案 xff1a gVim官网提供了很多配色方案 xff0c 可以根据自己的需要来选择下载 xff0c 本人比较喜欢深色背景系列的 xff0c 所以以下列举一些 x
  • Python中使用下划线定义变量的各种含义

    分类 在本文中 xff0c 我将讨论以下五种下划线模式和命名约定 xff0c 以及它们如何影响Python程序的行为 xff1a 单前导下划线 xff1a var单末尾下划线 xff1a var 双前导下划线 xff1a var双前导和末尾
  • Python 函数参数后面加冒号,函数后面跟箭头的含义

    span class token keyword def span span class token function f span span class token punctuation span text span class tok
  • “清一色”数列1,11,111,1111,...

    简单而有趣的 清一色 xff1a 1 11 111 1111 结论1 xff1a 数列中所有的项模4余3 证明 xff1a 显然可以从所有的项模2余1来思考 xff08 关于mod的一些变式 xff09 xff0c 这里用更基础的方法 每一
  • Windows系统和Linux系统服务器该如何远程连接

    程序架设离不开服务器 xff0c 而服务器跟我们家用电脑类似 xff0c 也都有操作系统 xff0c 目前市场广泛使用的服务器操作系统有Windows系统和Linux系统 那么我们改如果远程连接上去操作嗯 xff0c 接下来就给大家分享下常
  • 微信实现电脑远程关机

    实验室电脑经常忘记关机 xff0c 就想能不能外出的时候用手机来实现电脑关机 xff0c 于是就去敲了个代码 xff0c 借助新浪邮箱作为服务器 xff0c 对电脑远程关机 xff0c 简单实用 先来介绍一下实现原理 xff1a 1 用微信
  • QGIS 插件开发Debug教程——使用Pycharm

    参考文章 xff1a Remote Debugging Guide for Python PyQGIS CookBook 16 4 IDE settings for writing and debugging plugins Remote
  • QGIS 3.14插件开发——Win10系统PyCharm开发环境搭建四步走

    前言 xff1a 最近实习要求做一个QGIS插件 xff0c 网上关于QGIS 3 14插件开发环境搭建的文档不多 xff0c 而且也不算太全面 正好实习的时候写了一个文档 xff0c 在这里给大家分享一下 因为是Word转的Markdow

随机推荐