dotty编译器语法特性之一交叉类型,联合类型和文本单例类型

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

###翻译:http://dotty.epfl.ch/docs/reference/intersection-types.html #交叉类型

trait Resettable {def reset(): this.type
}
trait Growable[T] {def add(x: T): this.type
}
def f(x: Resettable & Growable[String]) = {x.reset()x.add("first")
}

这里x要求必须是Resettable类型和Growable[T]类型,交叉类型A & B 替代了scala2中的复合类型A with B(目前,这种复合类型仍然可以使用,但是未来会被废除)

with 复合类型不同,& 交叉类型是可互换的,比如:A & BB & A是相同的类型。 一个交叉类型A & B的所有成员,是类型A的所有成员和类型B的所有成员之和。

例如Resettable & Growable[String]类型拥有resetadd两个分别来自两个类型的成员方法。

如果一个成员既出现在A类型中,又出现在B类型中,那么这个成员的类型在类型A & B中表现为A类型和B类型交叉。比如下面的例子:

trait A {def children: List[A]def say:Int = 1
}
trait B {def children: List[B]def say:String = "2"
}
class C extends A with B {def children: List[A & B] =  List(new C)override  def say:Int & String = super.say  + 3}
val x: A & B = new C
val xs: List[A] & List[B] = x.children
val ys: List[A & B] = x.children

这个成员childrenA & B的类型,是 childrenA中的类型List[A]childrenB中类型List[B]的交叉类型List[A] & List[B] 。这个能进一步简化为List[A & B] ,因为List是协变的。

联合类型

翻译:http://dotty.epfl.ch/docs/reference/union-types.html

操作符|创建一个联合类型

case class UserName(name: String) {def lookup(admin: Admin): UserData
}
case class Password(hash: Hash) {def lookup(admin: Admin): UserData
}def help(id: UserName | PassWord) = {val user = id match {case UserName(name) => lookupName(name)case Password(hash) => lookupPassword(hash)}// ...
}

联合类型是双重交叉类型。联合类型A|B的值是所有A的值和所有B的值之和。 | 联合类型是可互换的,比如:A | BB | A是相同的类型。

只有当一个表达式明确给出类型的时候,编译器才会给这个表达式赋值一个联合类型,例如:

scala> val password = Password(123)
val password: Password = Password(123)
scala> val name = UserName("Eve")
val name: UserName = UserName(Eve)
scala> if (true) name else password
val res2: Object & Product = UserName(Eve)
scala> val either: Password | UserName = if (true) name else password
val either: Password | UserName = UserName(Eve)
scala>help(either)

res2的类型是Object & Product,它是 UserNameProduct的一个超类,但不是类型的最小超类Password | UserName。如果想获得最小超类,必须明确给出类型定义,就像这里的val either: Password | UserName的类型。要调用联合类型的成员,使用类型匹配match,比如这里的help方法

#文本单例类型 看以下例子:

object Literals{val fortyTwo: 42 = 42val `2`: 2 = 2val fortyFour: 44 = fortyTwo + `2`val text: "text" = "text"def id[T](a: T) = aval two: 2 = id(`2`)final val T = 1
val x: T.type = 2    // error , 2 should be 1
}

这里 val x: T.type = 2 会报错,因为T.type文本类型只能赋值为原本定义的值,这里是1。这里的final val定义个值不可变的单例文本类型,使用T.type来引用,且只能赋值为原值。

转载于:https://my.oschina.net/jackywyz/blog/913099

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】Zookeeper 安装和配置

转自:http://coolxing.iteye.com/blog/1871009 Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成集群模式. 下面将分别进行介绍. 单机模式 1. 配置 点击这里下载zookeeper的安装包之后, 解压到合适目录. 进入zookeeper目录下的conf子目录, 创建z…

一分钟精通Flask-Bootstrap的使用

要想在程序中集成Bootstrap,显然要对模板做所有必要的改动。不过,更简单的方法是使用一个名为Flask-Bootstrap 的Flask 扩展,简化集成的过程。 安装: Flask-Bootstrap 使用pip安装: pip install flask_bootstrap Fl…

linux生产环境下安装anaconda总结

前言: 工作中,常常要在新的linux生产服务器中安装自己的集成python环境,这种情况下有一点需要注意:不能覆盖生产服务器中的python环境(也就是自己的python环境要和系统的python环境分开)。一般情况下系统自…

FSF 称 DRM 被用于锁定、控制和监视用户

自由软件基金会正在督促美国政府废除DMCA中保护DRM的反规避条款。DMCA的1201条款禁止绕过DRM保护的内容和设备。 自由软件基金会的Donald Robertson在致函美国版权办公室的信(PDF)中指出,技术保护措施和数字限制管理(即DRM&#x…

改数据库表结构类型两种方法

alter table user change password password varchar(128) not null; alter table user modify column password varchar(128) not null;

申请评分卡(A卡)的开发过程(1)

前言: 本篇文章上接《申请评分卡简介》,有需要的童鞋可以参考下:https://blog.csdn.net/qq_16633405/article/details/107744921 下面介绍下A卡的开发步骤。 开发过程 1、评分卡模型开发步骤: 1、立项:场景&#…

E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-front

解决: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它? 方法: 重新启动虚拟机服务器 再在黑屏终端中重新尝试输入su…

聚类效果评估指标总结

前言 实际工作中经常会用到一些聚类算法对一些数据进行聚类处理,如何评估每次聚类效果的好坏?可选的方法有1、根据一些聚类效果的指标来评估;2、直接打点。今天就主要总结下这段时间了解的聚类效果评估指标。废话少说,直接上干货…

{%extends bootstrap/base.html%}的添加,使得其他block无法继承

仙说{%extends "bootstrap/base.html"%}用法: 在base.html中调用一次即可,并且 {%extends "bootstrap/base.html"%} 要放在 最后头!!最后头!最后头! base中不用再添加 {% block cont…

运用Nginx代理和UWSGI将Flask项目部署在Linux中 详细步骤

nginx: 安装可以参照的路径: http://nginx.org/en/linux_packages.html#Ubuntu 启动Nginx nginx [ -c configpath] 默认配置目录:/etc/nginx/nginx.conf 查看进程: ps -ef |grep nginx 控制Nginx nginx -s xxxstop 快速关闭quit …

机器学习算法之KNN

前言 KNN一般用于有监督的分类场景,除此之外,KNN在异常检测场景中也有应用,下面主要介绍下KNN在这两面的应用原理。 KNN做分类的原理 计算步骤如下: 1)算距离:给定测试对象,计算它与训练集中…

Supermap 组合单值专题图与标签专题图演示样例

效果图例如以下&#xff1a;单值专题图并显示每一个区域的相关文字信息 代码&#xff1a; <!DOCTYPE> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>单值专题图</title>…

[剑指Offer] 25.复杂链表的复制

1 /*2 struct RandomListNode {3 int label;4 struct RandomListNode *next, *random;5 RandomListNode(int x) :6 label(x), next(NULL), random(NULL) {7 }8 };9 */ 10 class Solution 11 { 12 public: 13 //在旧链表中创建新链表&#xff0…

Flask项目中应用七牛云存储

七牛云存储&#xff1a; https://developer.qiniu.com/kodo/sdk/1242/python 点击注册开通七牛开发者帐号 如果已有账号&#xff0c;直接登录七牛开发者后台&#xff0c;点击这里查看 Access Key 和 Secret Key pip install qiniu q Auth(Access Key,Secret Key) b…

异常检测算法之IForest

前言 IForest即孤立森林&#xff0c;可以用于做异常检测。一句话总结IForest做异常检测的原理&#xff1a;异常点密度小&#xff0c;基于树模型容易被一下切割出来&#xff0c;正常值密度大&#xff0c;需要切割多次才能得到目标值。 原理 iForest算法得益于随机森林的思想&…

用c#编写爬虫在marinetraffic下载船仅仅图片

近期在做船仅仅识别方面的事情&#xff0c;须要大量的正样本来训练adaboost分类器。于是到marinetraffic这个站点上下载船仅仅图片。写个爬虫来自己主动下载显然非常方便。 站点特点 在介绍爬虫之前首先了解一下marinetraffic这个站点的一些特点&#xff1a; 1. 会定期检測爬虫…

异常检测算法之LOF

前言&#xff1a; LOF&#xff1a;Local outlier factor&#xff0c;即局部异常因子。LOF主要是通过比较每个点p和其邻域点的密度来判断该点是否为异常点&#xff0c;如果点p的密度越低&#xff0c;越可能被认定是异常点。至于密度&#xff0c;是通过点之间的距离来计算的&…

Android属性动画进阶用法

2019独角兽企业重金招聘Python工程师标准>>> 在上周二文章中介绍补间动画缺点的时候有提到过&#xff0c;补间动画是只能对View对象进行动画操作的。而属性动画就不再受这个限制&#xff0c;它可以对任意对象进行动画操作。那么大家应该还记得之前我举的一个例子&am…

5.3linux下C语言socket网络编程简例

原创文章&#xff0c;转载请注明转载字样和出处&#xff0c;谢谢&#xff01; 这里给出在Linux下的简单socket网络编程的实例&#xff0c;使用tcp协议进行通信&#xff0c;服务端进行监听&#xff0c;在收到客户端的连接后&#xff0c;发送数据给客户端&#xff1b;客户端在接受…

异常检测算法之HBOS

前言 HBOS&#xff08;Histogram-based Outlier Score&#xff09;核心思想&#xff1a;将样本按照特征分成多个区间&#xff0c;样本数少的区间是异常值的概率大。 原理 该方法为每一个样本进行异常评分&#xff0c;评分越高越可能是异常点。评分模型为&#xff1a; 假设样…