2

我害怕阅读 Scala 3 会带来什么,特别注意复合类型的变化。它们总是有点像黑客,所以干净、真正的交叉口类型肯定是一种改进。我找不到关于复合类型的实际细化部分发生了什么的任何信息。在我当前的项目中,我严重依赖于强交织类型,以试图让每个返回值尽可能窄。因此,例如,拥有

trait Thing { thisThing =>
    type A
    type B
    type C

    def something :Thing { 
        type A = <related to thisThing.A> 
        type B <: <related to thisThing.B>
        type C = <etc>
    }

甚至还有可能吗?如何用新的语义来实现这个目标?据我了解,抽象类型的改进几乎肯定是不允许的,因此在类型层次结构的根中很难有一个“自我类型”声明:

trait Thing {
    type ThisThing <: Thing
    type A
    type B
    def copy(...) :ThisThing { type A = ...; type B = ... }
}

在一个有点相关的注释中,我正在研究结构类型。我必须说我喜欢我们如何使用静态声明来动态选择/实现成员。抽象类是否可能?我可以写类似的东西:

trait Record(members :(String, Any)*) extends Selectable { ... }

val r = new Record { val name :String; val age :Int }

编辑:我找到了相关的文档,看起来匿名Selectable实例不受匿名类的类型是其扩展类型的交集的规则的约束——很好。

4

1 回答 1

4

据我了解,几乎可以肯定不允许对抽象类型进行改进......

type A <: {
  type U
}

trait B {
  type T <: A
}

object o extends B {
  type T = A { type U = Int }
}

完美编译。

https://scastie.scala-lang.org/Nbz3GxoaTSe3VhXZz406vQ

不允许的是抽象类型的类型投影T#U

trait B {
  type T <: A
  type V = T#U // B.this.T is not a legal path since it is not a concrete type
}

https://scastie.scala-lang.org/xPylqOOkTPK9CvWyDdLvsA

http://dotty.epfl.ch/docs/reference/dropped-features/type-projection.html

也许你的意思是

type A {
  type U
}

不可解析。但在 Scala 2 中也不是这样。正确的是

trait A {
  type U
}

或者

type A <: {
  type U
}
于 2020-09-26T15:15:14.670 回答