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
并混合 T1
和 T2
的类型的替代方法。请注意,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,即T1
和T2
,c
的类型是D
)
是否
(使用匿名class代替D
,c
的类型是复合类型)。
准备学习 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
和 T2
的类型的替代方法。请注意,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,即T1
和T2
,c
的类型是D
)是否
(使用匿名class代替
D
,c
的类型是复合类型)。