【问题标题】:Compound type vs mixins in scalascala中的复合类型与mixins
【发布时间】:2021-01-03 15:21:49
【问题描述】:

准备在编程 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 ...

【问题讨论】:

  • 是一样的。在第一种情况下,编译器将生成扩展所有特征的匿名类。或者,您可以自己生成类

标签: scala inheritance types mixins compound-type


【解决方案1】:

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

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

对比

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

混合是特征

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

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

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


《Programming in Scala》的作者的意思是有一个替代方案:

  • 要么介绍D

    (那么D扩展了两个mixin,即T1T2c的类型是D

  • 还是不

    (要使用匿名类而不是Dc 的类型是复合类型)。

【讨论】:

  • 在 Scala 中,这两个世界并不代表二分法,实际上与描述前者的后者相交。
  • @AluanHaddad 是的,世界肯定是相交的(只是不重合)。
  • 他们对应。至少这是目标
  • @DmytroMitin 为什么作者会说This is an alternative to declaring a type that extends C and mixes in T1 and T2. Note that c is considered a subtype of all three types: 这个声明感觉就像是在说使用extend with mixins的替代方法
  • @AluanHaddad 目标是什么是有争议的。一方面,静态类型的存在是为了在编译时指定运行时行为并避免动态类型不一致。另一方面是类型级别的编程,类型具有独立的意义,目标是在类型级别进行计算,根据类型制定业务逻辑。
猜你喜欢
  • 2011-03-26
  • 2019-08-28
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
相关资源
最近更新 更多