5.3 用抽象类型建立泛型模型(Modeling Generics with Abstract Types)
一种语言里有两套抽象语法体系肯定会让人产生对这种语言复杂性的疑问:能不能就用一种形式化体系来实现?本节当中我们将会展示,函数式的类型抽象机制(也就是泛型)实际上可以通过面向对象的类型抽象机制(也就是抽象类型)来表达。这种表达方式的思路如下所述:
假定一个参数化类型C有一个类型参数t(可以直接推广到多个类型参数的情况),那么这种表达方式有四个关键组成部分:分别是类型自身的定义、类型实例的创建、基类构造子的调用以及这个类的类型实例(type instances)。
1. 类型定义,C的定义可以重写如下:
class C {
type t
/* rest of class */
}
也就是说,C的类型参数可以用其抽象成员来重新定义。如果类型参数有上界或者下界,则可以带到抽象成员的定义上。类型参数的协变性则不带到抽象成员的定义上,参见第4点。
2. 以T为参数创建实例的调用:new C[T]可以写成:
new C{ type t=T }
3. 如果C[T]出现在调用基类构造符的场合,则其子类的定义将会进行如下扩充:
type t = T
4. 每一个C[T]形式的类型定义都被扩充为如下的细化形式:
C { type t = T } 如果t被声明为非协变
C { type t <: T } 如果t被声明为协变
C { type t >: T } 如果t被声明为逆协变
这种表达方式在一种情况下会有问题:命名冲突。这是因为参数的名称成为了类的成员,可能和其他成员冲突,包括其父类的类型参数转化成的成员。这种冲突可以通过重命名解决,例如给每个类型名称指定一个唯一数字标识。
两种抽象模式之间可以转换,对于一种语言还是有价值的,因为可以降低其内在的概念复杂性。例如,Scala的泛型,实际上就是一种语法糖,完全可以被抽象类型替代掉。既然如此,也许会有人问,这种语法糖有没有必要性?或者说为什么不只用抽象类型呢,这样可以使语法本身简化很多。实际上,Scala中引入泛型有两重意义:首先,手工把泛型转化为成为抽象类型表达形式并不那么简单,不仅会丧失语法的简洁性,而且还可能带来前述的命名冲突等问题。其次,泛型和抽象类型在Scala中一般扮演不同的角色,泛型一般用于类型的实例化,而抽象类型主要用于在调用者代码中对相应的抽象类型进行引用。后者主要来自于两个场合:一个是有人需要在客户代码中隐藏相关类型信息,用于构造类似于SML模式的模块系统。另一个是在子类中协变地继承父类的类型,从而获得族多态。
可能有人会问,那么是否可以反过来用泛型来替代抽象类型呢?一些对于两种抽象方式都支持的系统进行的研究[27]证实,这样做要困难得多,至少整个程序都需要重写。不仅如此,如果系统要实现受限多态的话,重写类型上/下界的部分会呈平方级增长[8]。实际上这一点也不奇怪,因为这两种类型体系的理论基础就不同,泛型(不带F-界的)可以用F<:系统来表达[11],而抽象类型则建立在类型依赖的基础之上。后者比前者的表现力更强,例如,带路径依赖类型的vObj演算是可以涵盖F<:的。
分享到:
相关推荐
Scala支持抽象类和抽象成员,抽象类可以包含抽象方法和抽象字段,用于定义类的公共接口。 #### 继承与覆盖(override) Scala支持继承,子类可以通过覆盖父类的方法来自定义行为。覆盖时需要使用`override`关键字。 ...
#### 二、Scala概述 ##### 2.1 什么是Scala Scala是一种多范式编程语言,它结合了面向对象编程与函数式编程的特点。Scala语言的设计目标之一就是尽可能地提高代码的可读性和简洁性,同时保持高性能。由于Scala运行...
3. 静态类型系统:尽管Scala支持函数式编程,但它仍保持了严格的静态类型系统,这有助于捕获编程错误并在编译时解决,从而提高代码的可靠性和性能。 4. 类与特质(Traits):Scala的特质提供了一种轻量级的多重继承...
**Scala概述**: - **定义**:Scala是一种功能强大的编程语言,旨在集成面向对象编程和函数式编程的特点。它运行在Java平台上,并且与Java高度兼容。 - **为何选择Scala**: - **优雅性**:良好的API设计可以极大...
- 类是面向对象编程的基本单元,而特质类似于接口和抽象类的结合体。 - 通过组合多个特质,可以实现类的功能复用;或者通过混合特质,在实例化时添加新功能。 #### 结论 《Learning Scala》这本书不仅介绍了...
Scala是一种多范式编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种更高级别的抽象,使代码更加简洁、优雅。由于其与Java虚拟机(JVM)的紧密集成,Scala程序可以直接在Java平台上运行,这也是它被标记...
#### 一、Scala编程语言概述 Scala是一种现代的多范式编程语言,它结合了面向对象编程和函数式编程的特点。Scala的设计目标是解决Java等传统面向对象语言在扩展性和灵活性方面的局限性,同时保持与现有Java生态系统...
#### 五、Scala特性与设计模式结合 Scala作为一种功能强大的语言,支持多种高级特性,如类型推断、隐式转换、特质等,这使得设计模式在Scala中的应用更为高效和简洁。例如,使用Scala的特质可以轻松实现策略模式中...
#### 一、概述 在软件开发领域,设计模式是解决特定问题的一种通用可重用方案。本书《Scala设计模式》由John Hunt撰写,旨在为读者提供一系列实用的设计模式,并通过Scala语言进行实现。这些模式不仅能够帮助开发者...
本文探讨的主题——安全的类型级抽象在Scala中的应用,是理解该语言高级特性的关键所在。类型抽象是指在程序设计中,通过定义泛型或参数化类型来实现代码的复用性和灵活性。而类型级抽象则进一步将这种抽象概念应用...
#### 一、Scala语言概述 Scala是一种多范式编程语言,结合了面向对象编程和函数式编程的特点,运行在Java平台(JVM)上。它既能够提供静态类型检查的安全性,又能实现动态语言的灵活性。Scala的设计目标是解决Java的...
而“Scala编程语言”则可能是对Scala语言本身的一个概述,包括其设计理念和特性。 进一步的章节,如“变量的两种类型”、“可选类型”、“内置类型”、“字符串相关的注释”、“命令行I/O”、“控制结构”、“if/...
Akka框架借鉴了Erlang的并发模型,但它是建立在JVM之上,并且提供了丰富的抽象和工具,能够简化开发工作。 标题“Akka Scala 学习高清原版pdf”表明该文档是一个专注于Scala语言在Akka框架中应用的指南,而“描述”...
- **类与对象**:Scala提供了传统面向对象编程的所有特性,包括类继承、抽象类、接口等。 - **特质**:特质是Scala的一个独特特性,类似于其他语言中的接口和抽象类的组合。特质可以实现多个继承,并且可以包含...
- **第3章:Scala的下一步** - 学习带类型的参数化数组。 - 使用列表(List)。 - 使用元组(Tuple)。 - 学习集合(Set)和映射(Map)。 - 阅读文件中的信息。 - 理解函数式编程风格。 #### 第二部分:进阶篇 - **...
3. **元编程重构**:Scala 3的元编程API进行了重构,使用`quasiquotes`来表示和操作AST(抽象语法树),使得代码生成和编译时计算更加直观。 4. **互操作性改进**:Scala 3加强了与Java和其他JVM语言的互操作性,...
3. **函数式编程**:Scala是函数式编程的强大工具,支持高阶函数、匿名函数(lambda表达式)、闭包以及函数作为一等公民(即函数可以作为参数传递和作为返回值)。 4. **面向对象编程**:尽管Scala鼓励函数式编程,...