【PL理论】(34) 类型系统:不完备性 | 为什么推导树推导失败? | 实现类型系统 | 调整到类型系统 | 思考:强制程序员写类型还是自动推断类型?

news2024/12/25 10:52:10

  •  💬 写在前面:回顾我们的目标是为 F- 语言设计一个完备但不完全的类型系统,本章我们探讨的主题是类型系统的完备性。

目录

0x00 类型系统的不完备性

0x01 为什么推导树推导失败?

0x02 实现类型系统

0x03 调整到类型系统

0x04 思考:强制程序员写类型还是自动推断类型?


0x00 类型系统的不完备性

完备性属性可以描述如下:如果 𝝓 ⊢ 𝒆 ∶ 𝒕 成立,则程序 𝒆 不会出现类型错误。

同时,如果该程序终止并输出 𝒗 作为结果,则 𝒗 的类型是 𝒕

(注意,𝝓 ⊢ 𝒆 ∶ 𝒕 并不保证程序一定会终止)

下面我们来讨论一下类型系统的 不完备性 (Incompleteness)。

可能存在一些程序,即使没有任何类型错误,我们的类型系统也无法接受。

存在这样的程序 𝒆,使得对于某个𝒗,𝝓 ⊢ 𝒆 ⇓ 𝒗 成立,但对于任何𝒕,𝝓 ⊢ 𝒆 ∶ 𝒕 都不成立。比如 if true then 1 else false,再比如 let f x = x in if (f true) then (f 1) else 2

我们当前的类型系统不支持这种多态性:稍后我们将简要讨论这个问题。

0x01 为什么推导树推导失败?

\color{}f 不能同时是 \color{} int \rightarrow int\color{}bool \rightarrow bool

即使将 \color{}f 保持为 \color{}{}'a \rightarrow {}'a 类型也不能解决这个问题。

0x02 实现类型系统

到目前为止我们讨论过的类型规则 (𝚪 ⊢ 𝒆 ∶ 𝒕) 是我们类型系统的规范。

对于给定的程序 𝒆,如果存在某个类型 𝒕 使得 𝝓 ⊢ 𝒆 ∶ 𝒕 成立,那么我们的类型系统必须接受 𝒆。

如果不存在这样的类型 𝒕,则我们的类型系统将不接受 𝒆。

现在,让我们考虑如何实际实现它,我们应该如何编写这个类型系统的代码?

回顾一下解释器,当我们编写 F- 解释器时,语义可以很容易地通过递归实现。

我们可以直接将 𝝆 ⊢ 𝒆 ⇓ 𝒗 的定义翻译成代码 (就像下面的例子那样)

对于类型系统,我们是否也可以这么做呢?

let rec evalExp(exp: Exp) (env: Env) : Val =
  match exp with
  | LetIn(x, e1, e2) ->
    let v1 = evalExp e1 env
    evalExp e2(Map.add x v1 env)
  | ...

0x03 调整到类型系统

你可能会认为我们可以做同样的事情,对大多数情况而言,这是有效的。

如下例所示,注意下面的代码 (看起来是不是很类似于解释器的代码?):

let rec typeOf (exp: Exp) (tenv: TyEnv) : Typ =
  match exp with
    | LetIn (x, e1, e2) ->
    let t1 = typeOf e1 tenv
    typeOf e2 (Map.add x t1 tenv)
    | ...

0x04 思考:强制程序员写类型还是自动推断类型?

下面的类型规则中,我们无法通过递归来确定参数类型 \color{}t_a

在绘制推导树时,你可以用 "直觉" 来理解,但计算机是如何做到的?

let rec typeOf (exp: Exp) (tenv: TyEnv) : Typ =
  match exp with
    | LetFunIn (f, x, e1, e2) ->

    let ta = ??? // 这里我们应该做啥?

    let tr = typeOf e1 (Map.add x ta tenv)
    typeOf e2 (Map.add f (ta → tr) tenv)
  | ...

一个可能的解决方案是 —— 强制程序员写出参数类型(let f (x: int) = ...)

"程序员何必为难程序员……"

不然的话,我们就需要一个算法来 自动推断类型 了,我们会在下一章进行讲解!

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2024.6.14
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

- R. Neapolitan, Foundations of Algorithms (5th ed.), Jones & Bartlett, 2015.

- T. Cormen《算法导论》(第三版),麻省理工学院出版社,2009年。

- T. Roughgarden, Algorithms Illuminated, Part 1~3, Soundlikeyourself Publishing, 2018.

- J. Kleinberg&E. Tardos, Algorithm Design, Addison Wesley, 2005.

- R. Sedgewick&K. Wayne,《算法》(第四版),Addison-Wesley,2011

- S. Dasgupta,《算法》,McGraw-Hill教育出版社,2006。

- S. Baase&A. Van Gelder, Computer Algorithms: 设计与分析简介》,Addison Wesley,2000。

- E. Horowitz,《C语言中的数据结构基础》,计算机科学出版社,1993

- S. Skiena, The Algorithm Design Manual (2nd ed.), Springer, 2008.

- A. Aho, J. Hopcroft, and J. Ullman, Design and Analysis of Algorithms, Addison-Wesley, 1974.

- M. Weiss, Data Structure and Algorithm Analysis in C (2nd ed.), Pearson, 1997.

- A. Levitin, Introduction to the Design and Analysis of Algorithms, Addison Wesley, 2003. - A. Aho, J. Hopcroft, and J. Ullman, Data Structures and Algorithms, Addison-Wesley, 1983.

- E. Horowitz, S. Sahni and S. Rajasekaran, Computer Algorithms/C++, Computer Science Press, 1997.

- R. Sedgewick, Algorithms in C: 第1-4部分(第三版),Addison-Wesley,1998

- R. Sedgewick,《C语言中的算法》。第5部分(第3版),Addison-Wesley,2002

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java面试八股之什么是mybatis流式查询

什么是mybatis流式查询 Mybatis流式查询是一种处理大量数据的有效方法,它允许你以低内存消耗的方式来处理查询结果。传统的查询操作会一次性将所有数据加载到内存中,如果数据量非常大,可能会导致OutOfMemoryError(OOM&#xff09…

js语法---weakMap和weakSet:弱映射和弱集合

weakMap weakMap是Map的一种,但它有更多的限制, 1. WeakMap 和 Map 的第一个不同点就是,WeakMap 的键必须是对象,不能是原始值(number,string,symbol...) 2. WeakMap 不支持迭代以及 keys(),values() 和 entries() …

JavaScript的学习之旅(6.20)

目录 一、认识三个常见的js代码 二、js写入的第二种方式 三、js里内外部文件 一、认识三个常见的js代码 <script>//写入js位置的第一个地方// 控制浏览器弹出一个警告框alert("这是一个警告");// 在计算机页面输入一个内容&#xff08;写入body中&#xff…

力扣SQL50 至少有5名直接下属的经理 子查询 join 虚拟表

Problem: 570. 至少有5名直接下属的经理 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f37b;子查询 select name from Employee where id in(select managerId from Employee group by managerId having managerId ! null and count(*) > 5);&#x1f37b; join 虚拟…

力扣SQL50 有趣的电影 简单查询

Problem: 620. 有趣的电影 Code select * from cinema where id % 2 1 and description ! boring order by rating desc;

【云岚到家】-day04-1-数据同步方案-Canal-MQ

【云岚到家】-day04-1-数据同步方案-Canal-MQ 1 服务搜索1.1 服务搜索技术方案1.1.1 需求分析1.1.2 技术方案1.1.2.1 使用Elasticsearch进行全文检索1.1.2.2 索引同步方案 1.1.3 CanalMQ1.1.3.1 MySQL主从数据同步1.1.3.2 Canal工作流程1.1.3.3 具体实现方案 1.2 MQ技术方案1.2…

conda创建虚拟环境报错解决

1.报错截图 2.解决办法 查看当前所有虚拟环境 conda env list 解决办法 解决方法 bash conda config --add channels conda-forge conda config --set channel_priority strict conda config --set channel_priority flexible

Java文件/文件夹的新增/删除/递归遍历

获取File对象 这里的字符串可以乱写&#xff0c;但是如果不存在后续的操作也会失败 // 获取抽象的File对象&#xff08;文件或者目录&#xff0c;不一定真实存在&#xff09;File file1 new File("D:\\2_WorkSpace\\qcbyProject\\shixun\\collection-test\\src\\FileTes…

B站广告开户投流是什么政策?要哪些资质?

B站&#xff08;哔哩哔哩&#xff09;作为年轻人喜爱的视频分享社区&#xff0c;其广告价值也日益凸显。为了更好地服务广告主&#xff0c;B站近日对广告开户投流政策进行了更新&#xff0c;云衔科技作为专业的数字营销服务商&#xff0c;也积极响应&#xff0c;为广告主提供一…

【项目实践】Ulike充电牙刷拆解

前言 用了一段时间的充电牙刷&#xff0c;某一次突然没电了&#xff0c;按键也没有反应。无奈只能废弃。最近略微得了些空闲&#xff0c;想着把它拆解看看里面的结构和电路。以下是鼓捣过程记录。 为什么不能直接抽出来&#xff1f; 在网上看到很多拆解视频&#xff0c;都是打开…

CSS--解决图片变形的方法

原文网址&#xff1a;CSS--解决图片变形的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍html文件中图片变形的解决方法。 问题描述 我们经常需要指定所有图片的大小&#xff0c;让它们排列起来时看起来更整齐。但是&#xff0c;如果我们指定了width和height&#xff0c;那…

实践分享|关于 nebula-stats-exporter 的使用

大家好&#xff0c;这里是玖叁叁&#xff0c;目前从事全栈工程师工作&#xff0c;刚刚接触 NebulaGraph 不久&#xff0c;还在努力学习当中。图数据库可以高效地表达、存储和分析复杂关系和网络&#xff0c;在特定场景下有着不错的性能。希望通过这篇 nebula-stats-exporter 的…

Tesseract-OCR 5.0LSTM训练

准备工作 1.安装tesseract5.0版本 2.配置tesserac环境变量 3.jTessBoxEditor(需要java环境) 很多博客已有详细教程&#xff0c;不再赘述&#xff0c;本文以训练为主 最终文件目录: --tif 需要训练的tif文件 --lstmf 后文会讲到生成的方式 --txt 后文会讲到生成的方式 --box 后文…

JavaScript:at()方法遇到的问题并解决

目录 第一章 前言 第二章 使用at方法 第三章 分析原因并解决问题 第一章 前言 最近上线了一个项目&#xff0c;测试过程中并没有什么问题&#xff0c;但是上线后使用的用户多了&#xff0c;结果出现了这么一个问题&#xff1a;.at方法对低版本手机的浏览器不兼容问题&#x…

C++的动态内存分配

使用new/delete操作符在堆中分配/释放内存//使用new操作符在堆中分配内存int* p1 = new int;*p1 = 2234;qDebug() << "数字是:" << *p1;//使用delete操作符在堆中释放内存delete p1;在分配内存的同时初始化//在分配内存的时初始化int* p2 = new int(100…

windows和linux下清空Redis

前言 在本文中&#xff0c;我们将详尽阐述在Windows与Linux操作系统中有效清除Redis缓存的实践方法&#xff0c;旨在为您提供清晰、高效的指导流程&#xff0c;确保数据管理的灵活性与效率。 windows下推荐两款可视化工具 Another Redis Desktop Manager 这是我用的最多也是最…

【iOS】#include、#import、@class、@import

文章目录 #include#importclassimport总结 #include #include是c\c中的预处理器指令&#xff0c;用于包含头文件的内容 但是使用#include可能会出现重复包含文件的问题&#xff0c;因此需要使用&#xff08;#ifndef/#define/#endif&#xff09;。 #import //导入系统头文件…

Linux-目录和文件

目录 一、Linux目录 1、Linux常见目录 2、常见的Linux文件类型 二、cat-查看文件命令 1、cat命令用法 三、分页查看文件内容 1、 more命令 ​2、less命令 ​3、more和less的区别 四、查看文件开头或末尾 1、head命令 2、tail命令 3、wc-统计文件内容 4、grep 命令…

NLP基础概念

NLP任务不同于CV任务&#xff0c;它存在更多难点&#xff0c;例如&#xff1a; 数据表示&#xff1a;NLP任务处理的是文本数据&#xff0c;需要将自然语言文本转化为计算机可处理的形式&#xff0c;即如何把字符串变为数值数据&#xff0c;常用的有词嵌入&#xff08;Word Embe…

20240621 每日AI必读资讯

&#x1f916;GPT-4 通过图灵测试&#xff01;&#xff01; 研究人员称人们在图灵测试中无法区分 GPT-4 和人类&#xff0c;圣地亚哥加州大学认知科学系的研究人员针对GPT 4复刻了图灵测试。 研究人员招募了500名参与者&#xff0c;与四个代理人&#xff1a;人类、1960年代的…