首页 / SCALA / Scala函数---既存类型
Scala函数---既存类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Scala函数---既存类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2338字,纯文字阅读大概需要4分钟。
内容图文
![Scala函数---既存类型](/upload/InfoBanner/zyjiaocheng/1307/b9d65a41fbd6449fad17dc22b2a6faca.jpg)
语法:
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,σ是[t1/t1,..., tn/tn上的迭代,每个ti是介于σ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
关注超人学院微信二维码:650) this.width=650;" src="/upload/getfiles/default/2022/11/14/20221114023237271.jpg" />.
关注超人学院java免费学习交流群:650) this.width=650;" src="/upload/getfiles/default/2022/11/14/20221114023237466.jpg" />
原文:http://crxy2013.blog.51cto.com/9922445/1657614
内容总结
以上是互联网集市为您收集整理的Scala函数---既存类型全部内容,希望文章能够帮你解决Scala函数---既存类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。