Scala的路径相关类型是什么意思?


125

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


2
@Michel-我什至知道什么是PDT;我希望SO可以丰富答案!
oxbow_lakes

1
我希望在阅读有关PDT的ch12之后,能得到一个简洁的答案
堆垛机2010年

Answers:


165

我最喜欢的例子:

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

2
+1为答案。我发现最后一句话令人困惑:您说的是“类型安全性,它取决于值而不是类型本身”。对我来说,这听起来像是依赖类型,但是路径依赖类型本身并不依赖于值。您是否也感到困惑?
Matthew Farwell

4
@Matthew我明白您在说什么,但是路径依赖类型确实取决于值,即使它不提供通常与依赖类型相关联的灵活性。
Daniel C. Sobral

1
确实,这就是我的意思。最初,我读到类型取决于传递给构造函数的值,而不是b1 / b2。我现在知道了,但是花了我几读才知道。
Matthew Farwell

3
最简单的解释是,与路径有关的类型只是带有闭包的类,与函数可以从作用域绑定变量的方式完全相同。
polkovnikov.ph 2014年

1
但是,这种类比可能有一个根本的区别:一个绑定在运行时发生(用于闭包),另一个绑定在编译时发生(对于依赖路径的类型)。
jhegedus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.