为什么Scala中具有不同组件顺序的复合类型是等效的?

时间:2015-08-18 09:31:11

标签: scala

根据Scala Language Specification

  

如果它们的组分的序列是成对等价的,并且以相同的顺序出现,则两种化合物类型是等价的,并且它们的改进是等价的。如果它们绑定相同的名称,则两个细化是等价的,并且每个声明的实体的修饰符,类型和边界在两个细化中都是等效的。

然而,鉴于

trait A { val a: Int }
trait B { val b: String }

我正在

scala> implicitly[A with B =:= B with A]
res0: =:=[A with B,B with A] = <function1>

即。它们被认为是等效的,即使组件的顺序不同。为什么呢?

1 个答案:

答案 0 :(得分:3)

我认为=:=证据只断言每个都是另一个的上限。

trait A; trait B

import scala.reflect.runtime.{universe => ru}

val ab = ru.typeOf[A with B]
val ba = ru.typeOf[B with A]
ab =:= ba   // false!
ab <:< ba   // true!
ba <:< ab   // true!

如果LUB(X,Y)== X == Y,则基本上得到Predef,因为隐式解析会找到带有推断上限的=:=.tpEquals

这很可能是你想要的,因为这意味着你可以将一种类型视为另一种类型,这是有效的,因为A with B的成员等于B with A的成员,即使实现中的特征线性化是不同的。