语法:

Type ::= InfixType ExistentialClauses

ExistentialClauses ::= „forSome‟ „{‟ ExistentialDcl

{semi ExistentialDcl} „}‟

ExistentialDcl ::= „type‟ TypeDcl

| „val‟ ValDcl

既存类型具有 T forSome {Q}的形式,Q是一个类型声明的序列(§4.3)。设t1[tps1]>n<:Un是Q中声明的类型(不论什么类型參数部分[tpsi]都能够没有)。

每一个类型ti的域都包括类型T和既存子句Q。类型变量ti就称为在类型T forSome {Q}中被绑定。

在T中可是没被绑定的类型变量就被称为在T中是自由的。

T forSome {Q}的类的实例就是类σT,σ是t1,...,tn上的迭代,对于每个i。都有σLi<:σti<:σUi。既存类型T forSome{Q}的值的集合就是全部其类型实例值的集

类型合的合集。

T forSome {Q}的斯科伦化是一个类实例σT。σ是[t‟1/t1,..., t‟n/tn上的迭代,每一个t‟i是介于σLi和σUi间的新的抽象类型。

简化规则

既存类型遵循下面四个等效原则:

1. 既存类型中的多个for子句能够合并。例 T forSome {Q} forSome{Q‟}等价于T forSome {Q;Q‟}

2. 未使用的限定能够去掉。例:T forSome {Q;Q‟},可是Q‟中定义的类型没有被T或Q引用。那么该表达式可等价为 T forSome {Q}

3. 空的限定能够丢弃。例:T forSome{}等价于T。

4. 一个既存类型 T forSome {Q},Q中包括一个子句type t[tps] >: L <: U等价于类型 T‟ forSome {Q},T‟是将T中全部t的协变量替换为U而且将T中全部的t的逆变量替换为L的结果。

在值上的既存量化

为了语法上的方便。在既存类型上的绑定子句能够包含值声明 val x: T。既存类型T forSome { Q; val x: S; Q‟} 是T‟ forSome { Q; type t <: S with Singleton; Q‟}的简写形式,此处t是一个新的类型名,T‟是将T中全部x.type用t取代的结果。

既存类型的占位符语法

语法:

WildcardType ::= „_‟ TypeBounds

Scala支持既存类型的占位符语法。通配符类型的形式为 _><:U。两个边界均可忽略。

假设下界>被忽略则用>:scala.Nothing。

假设上界<:U被忽略则用<:scala.Any。通配符类型是既存限定类型变量的简写,既存的限定条件是内涵的。

通配符类型仅仅能作为參数化类型的类型參量出现。设T=p.c[targs,T,tags‟]是一个參数化类型,targs,targs‟能够为空。T是一个通配符类型_><:U。

那么T等价于下面既存类型:

p.c[tags,t,tags‟] forSome { type t ><:U}

t是一个新的类型变量。

通配符类型能够作为中缀类型(§3.2.8),函数类型(§3.2.9)或元组类型(§3.2.5)的一部分出现。

它们的扩展也就是等价參数化类型的扩展

演示样例3.2.5 假定下面类定义:

class Ref[T]

abstract class Outer { type T }

下面是一些既存类型的样例:

Ref[T] forSome { type T <: java.lang.Number }

Ref[x.T] forSome { val x: Outer }

Ref[x_type # T] forSome { type x_type <: Outer with Singleton }

非值类型

列表中的后两个类型是等价的。使用通配符语法的还有一种形式是:

Ref[_ <: java.lang.Number]

Ref[(_ <: Outer with Singleton)# T]

演示样例3.2.6 类型List[List[_]]等价于既存类型:

List[List[t] forSome { type t }]

演示样例3.2.7 假定有协变类型:

class List[+T]

类型:

List[T] forSome { type T <: java.lang.Number }

应用上面的第四条简化规则。上式等价于:

List[java.lang.Number] forSome { type T <: java.lang.Number }

假设再应用上面的第二和第三条简化规则。上式可化为:

List[java.lang.Number]

很多其它精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:.

关注超人学院java免费学习交流群:

Scala函数---既存类型的更多相关文章

  1. 泛函编程(4)-深入Scala函数类

    既然是泛函编程,多了解一下函数自然是免不了的了: 方法(Method)不等于函数(Function) 方法不是函数但可以转化成函数:可以手工转换或者由编译器(compiler)在适当的情况下自动转换. ...

  2. Scala 函数(五)

    函数是一组一起执行一个任务的语句. 您可以把代码划分到不同的函数中.如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的. Scala 有函数和方法, ...

  3. Scala:函数和闭包

    http://blog.csdn.net/pipisorry/article/details/52902271 Scala函数 Scala 有函数和方法,二者在语义上的区别很小.Scala 方法是类的 ...

  4. Scala函数与函数式编程

    函数是scala的重要组成部分, 本文将探讨scala中函数的应用. scala作为支持函数式编程的语言, scala可以将函数作为对象即所谓"函数是一等公民". 函数定义 sca ...

  5. Scala进阶之路-Scala函数篇详解

    Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...

  6. Spark记录-Scala函数

    Scala函数 Scala有函数和方法. Scala方法是一个具有名称和签名的类的一部分. Scala中的函数是一个可以分配给变量的完整对象. 函数定义可以出现在源文件中的任何位置. 不带参数的函数 ...

  7. Spark记录-Scala函数与闭包

    函数声明 Scala函数声明具有以下形式 - def functionName ([list of parameters]) : [return type] Scala 如果不使用等号和方法体,则隐式 ...

  8. GPU编程自学6 —— 函数与变量类型限定符

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  9. 3、scala函数入门

    1.定义函数 2.在代码块中定义函数体 3.递归函数与返回类型 4.默认参数 5.带名参数 6.变长参数 7.使用序列调用变长参数  8.过程 9.lazy值              10.异常 1 ...

随机推荐

  1. Linux学习之开机启动

    当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序.这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并 ...

  2. WPF中常用控件的属性

    Source = new BitmapImage( new Uri( WangCaiConfig.GetCurrentDirectory() + imgStr, UriKind.RelativeOrA ...

  3. ndk 编译 boost 库,支持serialization

    Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C+ ...

  4. 用Cython加速Python程序以及包装C程序简单测试

    用Cython加速Python程序 我没有拼错,就是Cython,C+Python=Cython! 我们来看看Cython的威力,先运行下边的程序: import time def fib(n): i ...

  5. CCNP路由实验(4) -- BGP

    基本配置:enableconf tno ip do loenable pass ciscoline con 0logg syncexec-t 0 0line vty 0 4pass ciscologg ...

  6. POJ 1721 CARDS(置换群)

    [题目链接] http://poj.org/problem?id=1721 [题目大意] 给出a[i]=a[a[i]]变换s次后的序列,求原序列 [题解] 置换存在循环节,因此我们先求出循环节长度,置 ...

  7. S3C6410嵌入式应用平台构建(一)

    [2014-4/8~4/10]目前我们已经积累一定的嵌入式相关知识,对嵌入式的架构及开发过程有了大体了解,唯一缺的就是实践,通过自己的分析搭建自己的嵌入式系统.下面,我将从此处开始记录我和我同学一起分 ...

  8. 如何:打开 IIS 管理器

    大家好,我叫李京阳,,很高兴认识大家,因为最近我发现很多朋友连打开IIS管理都不知道,可能也是因为各个系统的版本不同,所以今天发一简单贴说说打开IIS管理器. 启动 IIS 7.0 的 IIS 管理器 ...

  9. ios 设备用jquery live绑定 click 事件不管用

    问题描述:用js拼接的html追加到页面,然后用 live 绑定click事件不起作用 解决办法:1.直接在标签写onclick事件   2.给需要绑定的标签添加css样式{cursor:pointe ...

  10. 介绍 - OC中的代理模式

    一,代理设计模式的场合: 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象) 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象) 当对象A无法处理某些行为的时候,想让对 ...