134

我听说 Scala 有路径依赖类型。这与内部类有关,但这实际上意味着什么,我为什么要关心?

4

1 回答 1

180

我最喜欢的例子:

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。上面,最后一行不起作用,因为 的类型c2b2.Coordinate,而occupied' 的类型是Set[b1.Coordinate]。请注意,可以使用具有相同类型的另一个标识符b1,因此它不是与该类型关联的标识符。 b1例如,以下工作:

val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3
于 2010-04-22T21:22:24.413 回答