oxb*_*kes 117 type-systems scala path-dependent-type
我听说Scala有路径依赖类型.这与内部阶级有关,但这实际意味着什么,为什么我关心?
Dan*_*ral 157
我最喜欢的例子:
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
Run Code Online (Sandbox Code Playgroud)
因此,类型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
Run Code Online (Sandbox Code Playgroud)