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

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.上面,最后一行不起作用,因为类型c2b2.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)

  • @Matthew我理解你在说什么,但路径依赖类型_do_依赖于值,即使它不提供通常与依赖类型相关的灵活性. (4认同)
  • 最简单的解释是路径依赖类型只是带闭包的类,与函数绑定范围变量的方式完全相同. (3认同)
  • 答案为+1.我发现最后一句令人困惑:你说'类型安全取决于价值而不是单独的类型'.对我来说,这听起来像是依赖类型,但路径依赖类型本身并不依赖于值.你认为这也令人困惑吗? (2认同)
  • @tribbloid 不,不是真的。依赖类型依赖于_value_,而路径依赖类型依赖于_path_。从这方面来说,我举的例子是一个糟糕的例子,但是,嘿,那是 10 年前的事了,我并没有试图区分两者。理解区别的一个更好的例子可能是在超类中使用 _abstract_ 类型,这将为您提供保证,您将始终传递和接收正确的具体类型。但是,您必须为此查找其他资源。例如,请参阅 /sf/ask/1747250571/。 (2认同)