`
edge
  • 浏览: 66764 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Scala概述(五)抽象(1.1、1.2)

阅读更多

参数限定(Parameter bounds考虑这样一个方法:updateMax,他将一个cell的值设置为其当前值与一个给定值之间较大的那个。我们希望这个函数能够作用于所有的cell类型,只要其值类型能够按照一个特征(traitOrdered定义的“<”操作符进行比较。目前假定这个特征定义如下:(更精确的定义在Scala标准类库中)

trait Ordered[T] {

def < (x: T): boolean

}

这样,updateMax方法可以通过如下方式进行泛型定义,其中使用到的方法称为限定多态(Bounded polymorphism):

def updateMax[T <: Ordered[T]](c: GenCell[T], x: T) =

if (c.get < x) c.set(x)

这里,类型参数定义子句[T <: Ordered[T]]引入了受限类型参数T,它限定参数类型T必须是Ordered[T]的子类型。这样,“<”操作符就可以应用于类型为T的参数了。同时,这个例子还展现出一个受限参数类型本身可以作为其限定类型的一部分,也就是说Scala支持F-受限多态(F-bounded polymorphism[10])。

协变性(Variance泛型和子类型(subtyping)组合在一起产生这样一个问题:它们如何相互作用。如果C是一个类型构造子(type constructor),ST的一个子类,那么C[S]是不是也是C[T]的子类呢?我们把有这种特性的类型构造子称为协变的(covariant)。可以看出GenCell这个类型构造子显然不是协变的,否则的话,下面这段代码就是合法的,但实际上它将会在运行时抛出错误:

val x: GenCell[String] = new GenCell[String]("abc")

val y: GenCell[Any] = x; // illegal!

y.set(1)

val z: String = y.get

GenCell中的可变(mutable)变量使其无法成为协变的。实际上,GenCell[String]不是GenCell[Any]的子类,因为有些可以针对GenCell[Any]的操作不能应用于GenCell[String],例如将其设置一个整型值。

另一方面,对于不可变数据类型,构造子的协变性是很自然成立的。例如:一个不可变的整数列表自然可以被看做是一个Any列表的特例。此外,在另一些情况下我们正好需要逆协变性(contravariance),例如一个输出管道Chan[T],有一个以T为类型参数的写操作,我们自然希望对于所有T<:S,都有Chan[S]<:Chan[T]

Scala允许通过“+/-”定义类型参数的协变性,用“+”放在类型参数前表示构造子对于该参数是协变的,“-”则表示逆协变,没有任何符号则表示非协变。

下面的GenList定义了一个协变的列表,包含isEmptyheadtail等三个方法。

abstract class GenList[+T] {

def isEmpty: boolean

def head: T

def tail: GenList[T]

}

Scala的类型系统通过跟踪类型参数的每一次使用来确保协变性确实成立。这些使用位置被分为几类:出现在不可变字段和方法返回结果被认为是协变的;出现在方法参数和类型参数的上/下界时被认为是逆协变的;非协变的类型参数永远出现在非协变的位置;在一个逆协变类型参数的内部,协变与逆协变是反转的。类型系统保证协变(逆协变)的类型参数总是出现在协变(逆协变)的位置上。(这段话叙述比较抽象,没有给出任何例子。由于是在说明Scala编译器在协变这个概念上的实现机制,不关心语言实现细节的话可以在一定程度上忽略——译注)

下面是GenList的两个实现:

object Empty extends GenList[Nothing] {

def isEmpty: boolean = true

def head: Nothing = throw new Error("Empty.head")

def tail: GenList[Nothing] = throw new Error("Empty.tail")

}

class Cons[+T](x: T, xs: GenList[T])

extends GenList[T] {

def isEmpty: boolean = false

def head: T = x

def tail: GenList[T] = xs

}

注意:Empty对象代表一个空列表,其元素可以是任何类型。这一点就是由协变性保证的,因为Empty的类型是GenList[Nothing],对于任何T而言,它都是GenList[T]的子类型。

分享到:
评论
1 楼 edge 2008-11-02  
这一部分开始逐个讲解Scala的语法特点,涉及的都是函数式抽象的重要概念,逐渐展现Scala为了容纳这些概念而引入的一些复杂语法成分。

相关推荐

    maven-scala-plugin-1.1-alt.jar

    maven-scala-plugin-1.1-alt.jar

    scala-optparse-1.1.jar

    Scala的命令行选项解析 com.frugalmechanic/scala-optparse/1.1/scala-optparse-1.1.jar

    Scala 概述(瑞士洛桑联邦理工)

    Scala 概述(瑞士洛桑联邦理工) Scala 概述(瑞士洛桑联邦理工)

    apollo-scala-1.1-scaladoc.jar

    标签:apollo-scala-1.1-scaladoc.jar,apollo,scala,1.1,scaladoc,jar包下载,依赖包

    sbt in Action: The simple Scala build tool

    专门介绍SBT构建scala应用的新书,对学习scala很有帮助

    apollo-scala-1.2-scaladoc.jar

    标签:apollo-scala-1.2-scaladoc.jar,apollo,scala,1.2,scaladoc,jar包下载,依赖包

    Algebird—Scala的抽象代数工具

    Algebird —Scala的抽象代数工具

    scala for the impatient

    1.1 The Scala Interpreter — page 3 1.2 Declaring Values and Variables — page 5 1.3 Commonly Used Types — page 6 1.4 Arithmetic and Operator Overloading — page 7 1.5 Calling Functions and Methods ...

    scala五本经典资料集合

    scala是一个经典的语言,Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。但是现在scala的相关学习资料不多,因此,本人总结了几篇写的较好的scala学习资料,包含&lt;ScalaQuery_Commerzbank_2011&gt;&lt;twitter-...

    scala课件.zip

    Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx 面向对象编程(中级部分).pptx 面向对象编程(高级特性).pptx 隐式转换和隐式参数.pptx 集合(上)-基本使用...

    Scala程序设计(第2版)

    1.1 为什么选择Scala 1 1.1.1 富有魅力的Scala 2 1.1.2 关于Java 8 3 1.2 安装Scala 3 1.2.1 使用SBT 5 1.2.2 执行Scala命令行工具 6 1.2.3 在IDE中运行Scala REPL 8 1.3 使用Scala 8 1.4 ...

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    Programming.in.Scala.pdf

    Programming.in.Scala.pdf

    Scala语言规范1

    1.1. 1.2. 1.3. 1.3.1. 1.3.2. 1.3.3. 1.3.4. 1.3.5. 1.3.6. 1.3.7. 1.4. 1.5. 3.1. 3

    Scala 专题教程 - 抽象成员-内含源码以及设计说明书(可以自己运行复现).zip

    Scala 专题教程 - 抽象成员-内含源码以及设计说明书(可以自己运行复现).zip

    scala sdk scala-2.12.3

    scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3

    scala-sbt-scala编译工具

    scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...

    Scala编程实战.zip

    此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景...

    word源码java-pyspark-setup-guide:在Ubuntulinux下设置Spark+PySpark的指南

    1.2 1.3 1.4 2.1 2.2 2.3 3.1 为了运行 Spark,我们需要 Scala,而 Scala 又需要 Java。 所以,让我们先安装这些需求 1 | 安装要求 1.1 | 安装 Java $ sudo apt-add-repository ppa:webupd8team/java $ sudo apt-get...

Global site tag (gtag.js) - Google Analytics