Что имеется в виду под путевыми типами Scala? - PullRequest
116 голосов
/ 22 апреля 2010

Я слышал, что у Scala есть зависимые от пути типы.Это как-то связано с внутренними классами, но что это на самом деле означает и почему меня это волнует?

1 Ответ

154 голосов
/ 23 апреля 2010

Мой любимый пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...