编程与类型系统pdf下载pdf下载

编程与类型系统百度网盘pdf下载

作者:
简介:本篇主要提供编程与类型系统pdf下载
出版社:机械工业出版社自营官方旗舰店
出版时间:2021-01
pdf下载价格:10.00¥


预览


内容介绍

产品特色


编辑推荐

适读人群 :想提高代码质量的程序员 计算机专业的学生 想学习类型系统的读者

作为一名开发人员,在日常工作中巧妙地使用类型能够写出更好的代码,提高查找与数据相关的棘手错误的效率。本书讲解基于类型的技术,可用来编写安全、正确和容易维护的软件。


这本清晰易懂的教程主要面向有一定编程经验(如TypeScript、Java、JavaScript、C#或C++等主流编程语言使用经验)的开发人员,侧重于介绍类型系统为日常编程工作带来的实用好处。通过学习使用TypeScript编写的真实示例,你将全面了解类型系统在编程中的应用技巧。


内容简介

本书全面介绍类型系统的特性,从基本类型开始,一直介绍到函数类型和子类型、OOP、泛型编程和高阶类型(如函子和单子)。本书没有关注这些特性背后的理论,而是通过实际应用的方式来解释每种特性。本书说明了如何以及何时使用每种特性来改进代码。


作者简介

弗拉德.里斯库迪亚(Vlad Riscutia)

Microsoft的首席软件架构师,领导开发了几个大型软件项目,并指导了许多初级软件工程师。曾管理Office授权团队,包括将Office授权栈重新设计为基于服务的模型,集成Windows开箱即用体验,并发布Office 2019。


内页插图

精彩书评

“精彩地呈现了类型系统、数据结构、算法和编程范式(函数式和面向对象编程)方面的宝贵知识。”

——Fred Heath,Faria Education Group


“类型探索的一次胜利,用简洁的示例说明了类型如何使程序更加健壮和合理。”

——Theo Despoudis, Teckro


“涵盖了关于类型的你需要知道的一切信息,从布尔类型到单子。这本书为你保驾护航。”

——Desmond Horsley,NSW Health Pathology


“终于有一本书填补了类型系统的理论和实践的空白。”

—— Domingo Sebastian, Fundacio Bit


目录

第1章 类型简介1

1.1 为什么存在类型2

1.1.1 0和12

1.1.2 类型和类型系统的定义3

1.2 类型系统的优点4

1.2.1 正确性5

1.2.2 不可变性6

1.2.3 封装8

1.2.4 可组合性9

1.2.5 可读性11

1.3 类型系统的类型12

1.3.1 动态类型和静态类型12

1.3.2 弱类型与强类型13

1.3.3 类型推断15

小结15


第2章 基本类型17

2.1 设计不返回值的函数17

2.1.1 空类型18

2.1.2 单元类型20

2.1.3 习题21

2.2 布尔逻辑和短路21

2.2.1 布尔表达式22

2.2.2 短路计算22

2.2.3 习题24

2.3 数值类型的常见陷阱24

2.3.1 整数类型和溢出25

2.3.2 浮点类型和圆整28

2.3.3 任意大数30

2.3.4 习题31

2.4 编码文本31

2.4.1 拆分文本31

2.4.2 编码32

2.4.3 编码库34

2.4.4 习题36

2.5 使用数组和引用构建数据结构36

2.5.1 固定大小数组36

2.5.2 引用37

2.5.3 高效列表38

2.5.4 二叉树40

2.5.5 关联数组43

2.5.6 实现时的权衡44

2.5.7 习题44

小结44

习题答案45


第3章 组合46

3.1 复合类型47

3.1.1 元组47

3.1.2 赋予意义49

3.1.3 维护不变量50

3.1.4 习题53

3.2 使用类型表达多选一53

3.2.1 枚举53

3.2.2 可选类型55

3.2.3 结果或错误57

3.2.4 变体62

3.2.5 习题65

3.3 访问者模式65

3.3.1 简单实现66

3.3.2 使用访问者模式67

3.3.3 访问变体69

3.3.4 习题71

3.4 代数数据类型71

3.4.1 乘积类型71

3.4.2 和类型72

3.4.3 习题72

小结73

习题答案74


第4章 类型安全75

4.1 避免基本类型偏执来防止错误解释76

4.1.1 火星气候探测者号77

4.1.2 基本类型偏执反模式79

4.1.3 习题79

4.2 实施约束80

4.2.1 使用构造函数实施约束80

4.2.2 使用工厂实施约束81

4.2.3 习题82

4.3 添加类型信息82

4.3.1 类型转换82

4.3.2 在类型系统之外跟踪类型83

4.3.3 常见类型转换86

4.3.4 习题89

4.4 隐藏和恢复类型信息89

4.4.1 异构集合90

4.4.2 序列化92

4.4.3 习题95

小结96

习题答案96


第5章 函数类型98

5.1 一个简单的策略模式99

5.1.1 函数式策略100

5.1.2 函数的类型101

5.1.3 策略实现102

5.1.4 一等函数102

5.1.5 习题103

5.2 不使用switch语句的状态机103

5.2.1 类型编程小试牛刀104

5.2.2 状态机106

5.2.3 回顾状态机实现111

5.2.4 习题112

5.3 使用延迟值避免高开销的计算112

5.3.1 lambda113

5.3.2 习题115

5.4 使用map、filter和reduce115

5.4.1 map()115

5.4.2 filter()117

5.4.3 reduce()119

5.4.4 库支持122

5.4.5 习题123

5.5 函数式编程123

小结123

习题答案124


第6章 函数类型的高级应用126

6.1 一个简单的装饰器模式126

6.1.1 函数装饰器128

6.1.2 装饰器实现130

6.1.3 闭包130

6.1.4 习题131

6.2 实现一个计数器131

6.2.1 一个面向对象的计数器132

6.2.2 函数式计数器133

6.2.3 一个可恢复的计数器134

6.2.4 回顾计数器实现135

6.2.5 习题135

6.3 异步执行运行时间长的操作135

6.3.1 同步执行136

6.3.2 异步执行:回调136

6.3.3 异步执行模型137

6.3.4 回顾异步函数141

6.3.5 习题141

6.4 简化异步代码142

6.4.1 链接promise143

6.4.2 创建promise144

6.4.3 关于promise的更多信息146

6.4.4 async/await150

6.4.5 回顾整洁的异步代码152

6.4.6 习题152

小结153

习题答案153


第7章 子类型155

7.1 在TypeScript中区分相似的类型156

7.1.1 结构和名义子类型的优缺点158

7.1.2 在TypeScript中模拟名义子类型159

7.1.3 习题160

7.2 子类型的极端情况160

7.2.1 安全的反序列化160

7.2.2 错误情况的值164

7.2.3 回顾顶层和底层类型167

7.2.4 习题168

7.3 允许的替换168

7.3.1 子类型与和类型169

7.3.2 子类型和集合171

7.3.3 子类型和函数的返回类型172

7.3.4 子类型和函数实参类型174

7.3.5 回顾可变性178

7.3.6 习题178

小结179

习题答案179


第8章 面向对象编程的元素181

8.1 使用接口定义契约182

8.2 继承数据和行为185

8.2.1 “是一个”经验准则185

8.2.2 建模层次186

8.2.3 参数化表达式的行为187

8.2.4 习题188

8.3 组合数据和行为189

8.3.1 “有一个”经验准则189

8.3.2 复合类190

8.3.3 实现适配器模式192

8.3.4 习题194

8.4 扩展数据和行为194

8.4.1 使用组合扩展行为195

8.4.2 使用混入扩展行为197

8.4.3 TypeScript中的混入198

8.4.4 习题199

8.5 纯粹面向对象代码的替代方案199

8.5.1 和类型200

8.5.2 函数式编程202

8.5.3 泛型编程203

小结204

习题答案204


第9章 泛型数据结构206

9.1 解耦关注点207

9.1.1 可重用的恒等函数208

9.1.2 可选类型210

9.1.3 泛型类型211

9.1.4 习题211

9.2 泛型数据布局212

9.2.1 泛型数据结构212

9.2.2 什么是数据结构213

9.2.3 习题214

9.3 遍历数据结构214

9.3.1 使用迭代器216

9.3.2 流线化迭代代码220

9.3.3 回顾迭代器225

9.3.4 习题226

9.4 数据流226

9.4.1 处理管道227

9.4.2 习题228

小结228

习题答案229


第10章 泛型算法和迭代器232

10.1 更好的map()、filter()和reduce()233

10.1.1 map()233

10.1.2 filter()234

10.1.3 reduce()234

10.1.4 filter()/reduce()管道235

10.1.5 习题236

10.2 常用算法236

10.2.1 使用算法代替循环237

10.2.2 实现流畅管道237

10.2.3 习题241

10.3 约束类型参数241

10.3.1 具有类型约束的泛型数据结构242

10.3.2 具有类型约束的泛型算法243

10.3.3 习题245

10.4 高效reverse和其他使用迭代器的算法245

10.4.1 迭代器的基础模块247

10.4.2 有用的find()251

10.4.3 高效的reverse()254

10.4.4 高效地获取元素257

10.4.5 回顾迭代器259

10.4.6 习题260

10.5 自适应算法260

小结262

习题答案263


第11章 高阶类型及其他266

11.1 更加通用的map267

11.1.1 处理结果或传播错误270

11.1.2 混搭函数的应用272

11.1.3 函子和高阶类型273

11.1.4 函数的函子276

11.1.5 习题277

11.2 单子277

11.2.1 结果或错误277

11.2.2 map()与bind()的区别282

11.2.3 单子模式284

11.2.4 continuation单子285

11.2.5 列表单子286

11.2.6 其他单子288

11.2.7 习题288

11.3 继续学习289

11.3.1 函数式编程289

11.3.2 泛型编程289

11.3.3 高阶类型和范畴论289

11.3.4 从属类型290

11.3.5 线性类型290

小结290

习题答案291

附录A TypeScript的安装及本书的源代码293

附录B TypeScript速览表295


前言/序言

【关于本书】

本书旨在告诉你如何使用类型系统编写更好、更安全的代码。虽然大部分介绍类型系统的图书更加关注形式方面的讨论,但本书采用了偏向实用的做法。本书包含你在日常工作中可能遇到的许多示例、应用和场景。


【读者对象】

本书主要针对想要学习类型系统的工作原理以及使用类型系统来提高代码质量的程序员。你应该具备一些使用面向对象编程语言(如Java、C#、C++或JavaScript/TypeScript)的经验,还应该有一些软件设计经验。虽然本书的代码示例是基于TypeScript的,但是大部分内容是普遍适用的。事实上,本书的代码示例并非总是使用TypeScript特有的功能。在编写代码示例时,我尽可能让熟悉其他编程语言的程序员也容易理解它们。虽然本书会介绍各种技术来帮助你编写健壮的、可组合的、封装程度更好的代码,但是也假定了你知道为什么我们希望获得这些特性。此外,本书侧重类型系统的实际应用,因此涉及的数学理论较少,但是你应该熟悉基本的代数概念,如函数和集合等。


【本书的组织方式】

本书包含11章,涵盖类型编程的各个方面。

第1章介绍类型和类型系统,讨论它们为什么存在以及为什么有用。我们将讨论类型系统的类型,并解释类型强度、静态类型和动态类型。

第2章介绍大部分语言中都有的基本类型,以及在使用这些类型时需要注意的地方。常用的基本类型包括空类型、单元类型、布尔类型、数值类型、字符串类型、数组类型和引用类型。

第3章介绍组合,包括把类型组合起来定义新类型的各种方式,还介绍实现访问者设计模式的不同方式,并定义代数数据类型。

第4章讨论类型安全—如何使用类型来减少歧义以及防止错误。本章还介绍如何使用类型转换在代码中添加或移除类型信息。

第5章介绍函数类型,以及当我们获得了创建函数变量的能力后能够做些什么,还展示实现策略模式和状态机的不同方式,并介绍基本的map()、filter()和reduce()算法。

第6章以前一章为基础,展示函数类型的一些高级应用,包括简化的装饰器模式、可恢复的函数和异步函数。

第7章介绍子类型,并讨论类型兼容。我们会看到顶层类型和底层类型的应用,以及从子类型的角度看,和类型、集合和函数类型之间的关系。

第8章介绍面向对象编程的关键元素,以及什么时候使用每种元素,并讨论接口、继承、组合和混入。

第9章介绍泛型编程及其第一种应用—泛型数据结构。泛型数据结构把数据的布局与数据本身分隔开。迭代器支持遍历这些数据结构。

第10章继续介绍泛型编程,讨论泛型算法及迭代器的分类。泛型算法是能够在不同数据类型上重用的算法。迭代器用作数据结构和算法之间的接口,并且能够根据迭代器的能力启用不同的算法。

第11章介绍高阶类型、函子和单子的概念,以及如何使用它们,并为进一步学习提供一些建议。

本书中的各章以前面章节中的概念作为基础,故建议读者按顺序阅读。虽然如此,但是本书介绍的4大主题相对独立:前4章介绍基础知识;第5~6章介绍函数类型;第7~8章介绍子类型;第9~11章介绍泛型编程。


【关于代码】

本书以程序清单和嵌入在正文中的方式给出了许多源代码示例。这两种形式的代码都采用了等宽字体。有时候,代码还会被加粗显示,表示这部分代码相比该章前面的步骤发生了变化,例如,在现有的一行代码中添加了新特性。

在多数情况下,我调整了最初源代码的格式,添加了换行,调整了缩进,以适应版面空间。在少数情况下,即使这样调整后代码也无法放到一行,此时程序清单中会包含代码行延续标记()。另外,当在正文解释了程序清单中的代码时,常常会移除源代码中的注释。许多程序清单都带有代码标注,用于解释重要的概念。

本书的所有代码示例都可以在GitHub上获取,网址为https://github.com/vladris/programming-with-types/。生成代码时,使用了TypeScript 3.3版本,针对ES6标准,并使用了strict设置。


【前言】

我将多年间学习类型系统和软件正确性的经验汇聚起来,加以提炼,并辅以现实世界的应用,编写了这本实用的图书。

我一直对编写更好的代码有浓厚的兴趣,但是如果让我准确说出从什么时候开始走上这条道路,我会说是2015年。当时,我换了团队,想要快速学习现代C++。我开始观看C++会议视频,并阅读Alexander Stepanov关于泛型编程的著作,从一种完全不同的视角了解了如何编写代码。

与此同时,我在业余时间学习Haskell,一步步了解它的类型系统的高级特性。在使用函数式语言进行编程后,就能够很清晰地理解为什么随着时间的推移,更主流的语言开始采用函数式语言中的一些被认为理所当然的特性。

我阅读了关于这个主题的许多图书,包括Stepanov的Elements of Programming和From Mathematics to Generic Programming,Bartosz Milewski的Category Theory for Programmers,以及Benjamin Pierce的Types and Programming Languages。从书名就可以知道,这些图书更偏向理论/数学方面。在学习了关于类型系统的更多知识后,我在工作中编写的代码也变得更好了。类型系统设计的理论与日常生产软件之间存在直接的联系。这并不是一个革命性的发现:复杂的类型系统特性之所以存在,就是为了解决现实世界的问题。

我意识到,并不是每个程序员都有时间和耐心来阅读那些提供数学证明、讲解深入的图书。但我阅读这些书并没有浪费时间,这使我成为一名更好的软件工程师。我认为应该有这样一本书:以更加轻松的方式来介绍类型系统及它们提供的优势,并关注每个人能够在日常工作中使用的实际应用。

本书旨在全面介绍类型系统的特性,从基本类型开始,涵盖函数类型和子类型、OOP、泛型编程和高阶类型(如函子和单子)。我没有关注这些特性背后的理论,而是通过实际应用的方式来解释每种特性,说明如何以及何时使用这些特性来改进代码。

我一开始打算使用C++来编写代码示例。C++的类型系统十分强大,并且具有比Java和C#等语言更多的特性。但另一方面,C++是一个复杂的语言,而我不想限制本书的受众,所以后来决定使用TypeScript。TypeScript也有一个强大的类型系统,但是其语法更加容易理解,因此即使你使用的是其他语言,在学习本书的大部分示例时应该也不会有太大的难度。附录B为本书用到的TypeScript语法提供了一个速览表。

我希望你能享受阅读本书的过程,并学到一些可以立即用在项目中的新技术。