Dotty 是否支持改进?
Does Dotty support refinements?
我在阅读 Scala 3 时感到恐惧,特别注意复合类型的变化。它们总是有点像 hack,所以干净、真实的交叉类型肯定是一种改进。我找不到关于复合类型的实际细化部分发生了什么的任何信息。在我当前的项目中,我严重依赖强交织类型,试图让每个返回值尽可能窄。因此,例如,有
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>
}
还有可能吗?如何用新的语义来实现这个目标?据我了解,抽象类型的改进几乎肯定是不允许的,因此很难在类型层次结构的根中有一个 'self type' 声明:
trait Thing {
type ThisThing <: Thing
type A
type B
def copy(...) :ThisThing { type A = ...; type B = ... }
}
在某种程度上相关的注释中,我正在研究结构类型。我必须说我喜欢我们如何使用静态声明来动态成员 selection/implementation。抽象 classes 是否可能?我可以这样写吗:
trait Record(members :(String, Any)*) extends Selectable { ... }
val r = new Record { val name :String; val age :Int }
编辑:我找到了相关的文档,看起来匿名 Selectable
实例不受匿名 class 的类型是其扩展类型的交集的规则的约束 - 很好.
As I understand, refinements of abstract types will almost certainly be not allowed...
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
}
我在阅读 Scala 3 时感到恐惧,特别注意复合类型的变化。它们总是有点像 hack,所以干净、真实的交叉类型肯定是一种改进。我找不到关于复合类型的实际细化部分发生了什么的任何信息。在我当前的项目中,我严重依赖强交织类型,试图让每个返回值尽可能窄。因此,例如,有
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>
}
还有可能吗?如何用新的语义来实现这个目标?据我了解,抽象类型的改进几乎肯定是不允许的,因此很难在类型层次结构的根中有一个 'self type' 声明:
trait Thing {
type ThisThing <: Thing
type A
type B
def copy(...) :ThisThing { type A = ...; type B = ... }
}
在某种程度上相关的注释中,我正在研究结构类型。我必须说我喜欢我们如何使用静态声明来动态成员 selection/implementation。抽象 classes 是否可能?我可以这样写吗:
trait Record(members :(String, Any)*) extends Selectable { ... }
val r = new Record { val name :String; val age :Int }
编辑:我找到了相关的文档,看起来匿名 Selectable
实例不受匿名 class 的类型是其扩展类型的交集的规则的约束 - 很好.
As I understand, refinements of abstract types will almost certainly be not allowed...
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
}