Scala 的路径依赖类型是什么意思?

我听说 Scala 具有依赖于路径的类型。这和内部课程有关,但是这到底意味着什么,我为什么要关心呢?

14218 次浏览

我最喜欢的例子:

case class Board(length: Int, height: Int) {
case class Coordinate(x: Int, y: Int) {
require(0 <= x && x < length && 0 <= y && y < height)
}
val occupied = scala.collection.mutable.Set[Coordinate]()
}


val b1 = Board(20, 20)
val b2 = Board(30, 30)
val c1 = b1.Coordinate(15, 15)
val c2 = b2.Coordinate(25, 25)
b1.occupied += c1
b2.occupied += c2
// Next line doesn't compile
b1.occupied += c2

因此,Coordinate的类型取决于实例化它的 Board的实例。有很多事情可以通过这种方式来完成,给出一种类型安全性,这种安全性依赖于值,而不仅仅是类型。

这可能听起来像是依赖类型,但是它的局限性更大。例如,occupied的类型取决于 Board的值。上面的最后一行不起作用,因为 c2的类型是 b2.Coordinate,而 occupied的类型是 Set[b1.Coordinate]。注意,可以使用具有相同类型 b1的另一个标识符,因此与该类型关联的不是 标识符b1。例如,以下作品:

val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3