Scala 中的复合类型与混入

Compound type vs mixins in scala

准备学习 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 并混合 T1T2 的类型的替代方法。请注意,c 被视为所有三种类型的子类型:

val t1: T1 = c
val t2: T2 = c
val c2: C  = c

我想到的问题是,为什么要选择?如果你向一种语言添加一些东西,它应该会增加一些价值,否则它是无用的。因此,复合类型的附加值是什么,它与 mixins 相比如何,即 extend ... with ...

混合类型和复合类型是不同的概念:

https://docs.scala-lang.org/tour/mixin-class-composition.html

对比

https://docs.scala-lang.org/tour/compound-types.html

Mixins 是 traits

trait T1
trait T2
class C
class D extends C with T1 with T2
val c = new D

部分情况是匿名 class 而不是 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

(*) 中 c 的类型是复合类型。

mixin 的概念来自 classes、继承、OOP 等领域。复合类型的概念来自类型、子类型、类型系统、类型理论等领域


《Programming in Scala》作者的意思是还有一个选择:

  • 要么介绍D

    (然后D扩展了两个mixins,即T1T2c的类型是D)

  • 是否

    (使用匿名class代替Dc的类型是复合类型)。