scala - scala中的复合类型与mixins
问题描述
准备在编程 scala 第 2 版中介绍复合类型,留下的问题多于答案。
当您声明一个组合了多种类型的实例时,您将获得一个复合类型:
trait T1
trait T2
class C
val c = new C with T1 with T2 // c's type: C with T1 with T2
在这种情况下,类型c
是C with T1 with T2
。这是声明扩展C
和混合在T1
and中的类型的替代方法T2
。请注意,它c
被视为所有三种类型的子类型:
val t1: T1 = c
val t2: T2 = c
val c2: C = c
想到的问题是,为什么要替代?如果你在一种语言中添加一些东西,它应该会增加一些价值,否则它是无用的。因此,复合类型的附加值是什么,它与 mixins 相比如何,即扩展 ... 与 ...
解决方案
Mixin 和复合类型是不同的概念:
https://docs.scala-lang.org/tour/mixin-class-composition.html
对比
https://docs.scala-lang.org/tour/compound-types.html
Mixin 是 trait
trait T1
trait T2
class C
class D extends C with T1 with T2
val c = new D
部分情况是匿名类代替D
trait T1
trait T2
class C
val c = new C with T1 with T2 // (*)
复合类型是类型
type T = Int with String with A with B with C
in (*) 的类型c
是复合类型。
mixin 的概念来自类、继承、OOP 等领域。复合类型的概念来自类型、子类型、类型系统、类型理论等领域。
“在 Scala 中编程”的作者的意思是有一个替代方案:
要么介绍
D
(然后
D
扩展两个mixin,即T1
andT2
,类型为c
isD
)或不
(要使用匿名类而不是
D
,类型c
是复合类型)。
推荐阅读
- r - 如何通过聚合 R 中的二进制项来创建新变量?
- tensorflow - 如何使用 FFT 和神经网络对声音进行分类?我应该使用 CNN 还是 RNN?
- ruby-on-rails - Rspec突然只运行一项测试
- sql-server - 如何将数据从多个表插入到 SSIS 中的单个表中?
- java - 有没有办法在点的末尾添加一个字符串而不手动输入它?
- php - 捕获错误 PHP/Apache 后继续执行
- matlab - 创建一个特殊的对角矩阵
- javascript - 将循环 jinja 类中特定类的数据发送到模态
- google-cloud-storage - Google DataProc Presto:如何将 Presto 查询结果写入谷歌云存储?
- python - 如何按日期时间对两个聚合列表进行排序?