programming-languages学习笔记–第10部分

*/-->

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

pre.src {background-color: #292b2e; color: #b2b2b2;}

programming-languages学习笔记–第10部分

1 Subtyping

  • 伪代码表示:

创建record: {f1=e1, f2=e2, …, fn=en},
字段访问:e.f,字段更新:e1.f=e2

基本的类型系统:
{f1:t1, f2:t2, …, fn:tn}

a:{x:real, y:real}与类型
b:{x:real, y:real, color:string}不同,但是可以在接受第一种类型的地方使用第二种类型。
让使用a的地方用b代替通过类型检查。就是Subtyping。

2 子类关系

保持subtyping独立,一个编程语言已经有很多类型规则,不去修改它们,只增加subtyping。
用t1 <: t2(类型间的二元关系)表示t1是t2的子类型,如果e拥有类型t1并且t1 <: t2,则e也拥有类型t2。

如果t1 <: t2,则t1类型的任何值都可以用在t2可以使用的地方。

3 Depth Subtyping

深度子类化:
{center:{x:real,y:real,z:real}, r:rael} <:
{center:{x:real,y:real}, r:real}
如果要让这个子类化成立,则需要添加规则,
if ta <: tb then {f1:t1,…,f:ta,…,fn:tn} <:
{f1:t1,…,f:tb,…,fn:tn}
但是它破坏了可靠性(soundness),可以访问不存在的字段。

如果字段是不可变的,则深度子类化是可靠的,只能从3个里面选2个:setters,depth subtyping, soundness。

4 Function Subtyping

函数类型,在higher-order函数中,参数可以用使用t3->t4代替t1->t2么?

函数返回值是可以的:
if ta <: tb then t->ta <: t->tb
函数返回值是协变(covariant)的。

函数参数不可以:
ta <: tb 不允许 ta->t <: tb->t,
相反的情况可以:
if tb <: ta then ta->t <: tb->t,
参数类型是逆变(contravariant)的。

可以综合起来:
if t3 <: t1 and t2 <: t4, then t1->t2 <: t3->t4。
参数是逆边,返回值是协变。

5 OOP中的子类化

子类关系就是子类型关系。

一个对象就是包含字段和方法的记录:

  • 可变字段
  • 方法是可变函数,并且可以访问self

可以设计一个像记录类型的类型系统:

  • 子类型可以有额外的字段和方法
  • 覆盖方法需要逆变参数和协变返回值,与函数子类化相似。

self/this是特殊的,虽然是函数参数,但它是协变的。子类中的方法只能使用子类可用的字段和方法。

6 泛型对比子类化

在ML中:

fun compose (g,h) = fn x => g (h x)
(* val compose = fn : ('a -> 'b) * ('c -> 'a) -> 'c -> 'b *)

子类化不适合这样的操作,作为容器不方便。
需要做downcast,并且需要运行时开销。

子类化适用于表示几何,GUI等。

7 Bounded Polymorphism

结合泛型和子类化,就是有界多态。

作者: ntestoc

Created: 2019-01-09 三 13:31

programming-languages学习笔记--第10部分的更多相关文章

  1. 【python学习笔记】10.充电时刻

    [python学习笔记]10.充电时刻 任何python都可以作为模块倒入 *.pyc:平台无关的经过编译的的python文件, 模块在第一次导入到程序中时被执行,包括定义类,函数,变量,执行语句 可 ...

  2. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  3. Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析(1-4)

    Linux学习笔记(10)linux网络管理与配置之一——主机名与IP地址,DNS解析与本地hosts解析 大纲目录 0.常用linux基础网络命令 1.配置主机名 2.配置网卡信息与IP地址 3.配 ...

  4. SpringBoot学习笔记(10):使用MongoDB来访问数据

    SpringBoot学习笔记(10):使用MongoDB来访问数据 快速开始 本指南将引导您完成使用Spring Data MongoDB构建应用程序的过程,该应用程序将数据存储在MongoDB(基于 ...

  5. Flutter学习笔记(10)--容器组件、图片组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...

  6. javaSE学习笔记(10)---List、Set

    javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...

  7. Ionic2学习笔记(10):扫描二维码

    作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5575843.html 时间:6/11/2016     说明: 在本文发表的时候(2016-06-1 ...

  8. Git学习笔记(10)——搭建Git服务器

    本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...

  9. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

随机推荐

  1. 【转】maven profile实现多环境打包

    作为一名程序员,在开发的过程中,经常需要面对不同的运行环境(开发环境.测试环境.生产环境.内网环境.外网环境等等),在不同的环境中,相关的配置一般不一样,比如数据源配置.日志文件配置.以及一些软件运行 ...

  2. 地址解析协议ARP,网络层协议IP、ICMP协议

    分析所用软件下载:Wireshark-win32-1.10.2.exe 阅读导览 1. 分析并且应用ARP协议 2.分析IP协议 3.分析ICMP协议 1.分析arp报文的格式与内容 (1)ping ...

  3. 解决 ImportError: cannot import name pywrap_tensorflow

    原文:https://aichamp.wordpress.com/2016/11/13/handeling-importerror-cannot-import-name-pywrap_tensorfl ...

  4. Java程序中的死锁

    什么是死锁? 死锁是一种特定的程序状态,主要是由于循环依赖导致彼此一直处于等待中,而使得程序陷入僵局,相当尴尬.死锁不仅仅发生在线程之间,而对于资源独占的进程之间同样可能出现死锁.通常来说,我们所说的 ...

  5. 在vue中子组件修改props引发的对js深拷贝和浅拷贝的思考

    不管是react还是vue,父级组件与子组件的通信都是通过props来实现的,在vue中父组件的props遵循的是单向数据流,用官方的话说就是,父级的props的更新会向下流动到子组件中,反之则不行. ...

  6. 解决ubuntu使用命令sudo apt -get install 安装东西时出现"E: Sub-process /usr/bin/dpkg returned an error code (1) "的错误

    问题描述: 今天在使用命令 "sudo apt-get install python3-pip"安装时,总是出现如下图这样的错误,开始以为是以为自己python版本的问题,后来发现 ...

  7. JSON学习笔记-1

    1.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...

  8. 需要警惕的linux命令

    Linux shell/terminal命令非常强大,即使一个简单的命令就可能导致文件夹.文件或者路径文件夹等被删除.为了避免这样的事情发生,我们应该时刻注意PHP代码&命令,今天为大家带来9 ...

  9. Mysql性能监控项及sql语句

    推荐一款mysql监控软件MONyog 1.查询缓存: mysql> show variables like '%query_cache%'; 2.缓存在Cache中线程数量thread_cac ...

  10. SQL Server ->> 使用CROSS APPLY语句是遇到聚合函数中包含外部引用列时报错

    本次遇到的问题是CROSS APPLY的内部查询语句中的聚合函数包含CASE WHEN判断,且同时又内部语句的表的列和外部引用的表的列,此时会报下列的错误. 消息 8124,级别 16,状态 1,第 ...