路径依赖类型(Path-dependent types) 不知道AbsCell绑定的类型情况下,也可以对其进行访问。下面这段代码将一个cell的值恢复成为其初始值(init),而无需关心cell值的类型是什么。
def reset(c: AbsCell): unit = c.set(c.init)
为什么可以这样做呢?因为c.init的类型是c.T,而c.set是c.T=>unit类型的函数,因此形参与实参类型一致,方法调用是类型正确的。
c.T是一个路径依赖类型的例子,通常来讲,这种类型的形式是:x1.x2.….xn.T(n>0),x1,…,xn是不可变的值,而T是xn的类型成员。路径依赖类型是Scala的一个新颖的特性,其理论基础是vObj calculus[36]。
路径依赖类型要依靠其前缀路径的不可变性,下面给出一个违反了不可变性的例子:
var flip = false
def f(): AbsCell = {
flip = !flip
if (flip) new AbsCell { type T = int; val init = 1 }
else new AbsCell { type T = String; val init = "" }
}
f().set(f().get) // illegal!
在上例中,每一次调用f()分别返回int和String类型的值,因此最后一句是错误的,因为它要将String类型的值赋给一个int值的cell。Scala类型系统禁止这种调用,因为f().get的类型是f().T,而这不是一个有效类型,因为f()不是一个有效路径。
类型选择与单例类型(Type selection and singleton types)在Java中,类型定义可以嵌套,嵌套类型用其外部类型做前缀的形态表示。在Scala中,则通过“外部类型#内部类型”(Outer#Inner)的方式来表示,“#”就称作类型选择(Type Selection)。从概念上说,这与路径依赖类型(例如:p.Inner)不同,因为p是一个值,不是一个类型。进一步而言,Outer#t也是一个无效表达式,如果t是一个定义在Outer中的抽象类型的话。
实际上,路径依赖类型可以被扩展成为类型选择,p.t可以看做是p.type#t,这里p.type就称作单例类型,仅代表p所指向对象的类型。单例类型本身对于支持方法调用串接很有作用,考虑如下代码:C有一个incr方法,对其值+1,其子类D由一个decr方法,对其值-1。
class C {
protected var x = 0
def incr: this.type = { x = x + 1; this }
}
class D extends C {
def decr: this.type = { x = x - 1; this }
}
从而我们可以将相关调用串接起来:
val d = new D; d.incr.decr
如果没有this.type这个单例类型,上述调用是非法的,因为d.incr的类型应该是C,但C并没有decr方法。从这个意义上说,this.type类似于Kim Bruce的mytype[29]的一个协变的使用方式。
分享到:
相关推荐
#### 二、Scala概述 ##### 2.1 什么是Scala Scala是一种多范式编程语言,它结合了面向对象编程与函数式编程的特点。Scala语言的设计目标之一就是尽可能地提高代码的可读性和简洁性,同时保持高性能。由于Scala运行...
- **3.4.1 Scala**: 在Scala中可以将内联函数、方法引用或静态方法传递给Spark。确保这些函数及其引用的数据是可序列化的。 **3.5 常见的转换操作与行动操作** - **基本RDD操作**: - **针对各元素的操作**: - `...
#### 1 概述 ##### 1.1 前言 随着计算机硬件技术和网络技术的快速发展,计算机拥有的核心数量不断增多,分布式技术和集群技术的成熟使得一个应用程序可以被分解运行在多台独立的计算机上,这些计算机可能运行着...
#### 一、SparkSQL概述 **1.1 什么是SparkSQL** SparkSQL是Apache Spark框架中的一个重要组件,主要用于处理结构化的数据。它为开发者提供了两个关键的功能:DataFrame API 和 SQL 查询语言的支持。DataFrame API ...
Spark SQL概述 1.1 **什么是Spark SQL** Spark SQL是Apache Spark的一个核心组件,它集成了SQL查询和Spark的分布式计算能力,使得开发人员可以使用SQL或者DataFrame和DataSet API对大规模数据进行查询和分析。...
##### 2.2 Spark Core概述 - **定义**: Spark Core是Spark框架的基础模块,提供了分布式任务调度、内存管理、故障恢复等功能。 - **RDD模型**: 弹性分布式数据集(Resilient Distributed Datasets, RDD)是Spark中最...
#### 1.1 Spark概述 Apache Spark是一种开源的大规模数据处理框架,它提供了一个比Hadoop MapReduce更为高级且易用的API,能够支持多种计算模式,包括批处理、交互式查询、流处理等。Spark的核心特性在于其内存计算...
**2.1 Spark 概述** Apache Spark 是一个开源的分布式计算系统,它不仅速度快,而且提供了丰富的数据处理库。Spark 支持多种编程语言,包括 Scala、Java 和 Python 等。 **2.2 Spark 核心组件** Spark 包含以下几...
相比之下,深度学习方法如CNN能够学习到更抽象、更具鲁棒性的特征,从而适应各种手写风格。 2.2 卷积神经网络(CNN) CNN的核心在于卷积层,其通过滤波器(或称卷积核)在输入图像上滑动,提取局部特征。池化层则...
#### 一、概述 在当前的大数据处理领域,Apache Spark凭借其高效的内存计算能力和丰富的生态系统成为了行业的佼佼者。Spark不仅支持批量处理,还支持实时流处理,后者通过Structured Streaming(结构化流)实现了对...
#### 一、SparkSQL概述 **SparkSQL**是Apache Spark的一个模块,用于处理结构化和半结构化数据。它提供了一个编程抽象称为DataFrame,并且充当了分布式数据集上的关系数据库查询引擎。SparkSQL的设计旨在简化大数据...
#### 一、SparkSQL概述 ##### 1.1 什么是SparkSQL SparkSQL是Apache Spark框架中的一个核心组件,主要用于处理结构化的数据。它提供了一个名为DataFrame的高级抽象,并且能够作为一个分布式SQL查询引擎来运行。与...
- **Spring Scala**:支持Scala语言编程。 - **Spring BlazeDS Integration**:集成Adobe Flex、BlazeDS等技术开发RIA。 - **Spring Loaded**:用于实现Java应用程序的热更新。 #### 四、学习建议 在学习Spring ...
- **定义**:RDD是Spark中最基本的数据抽象,是一个不可变的、分布式的数据集合。 - **特点**: - 支持容错恢复:通过血统信息追踪丢失的数据块。 - 支持缓存:可以将RDD持久化在内存中以加速后续的迭代计算。 ...
#### 一、Spark概述 **1.1 什么是Spark** Spark是一种高性能、多功能且可扩展的大数据分析处理引擎。它最初由加州大学伯克利分校的AMPLab研发,于2009年问世,并在2010年开源。随着Spark社区的不断发展,它在2013...
- **hive/console原理**:概述了Hive控制台的工作原理及其与SparkSQL之间的交互。 **4.2 常用操作** - **查看查询的schema**:展示如何查看查询结果的schema信息。 - **查看查询的整个运行计划**:展示了如何查看...