Что подразумевается под путевым типом Scala?

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

114 голосов | спросил oxbow_lakes 22 PMpThu, 22 Apr 2010 21:32:16 +040032Thursday 2010, 21:32:16

1 ответ


0

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

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
ответил Daniel C. Sobral 23 AMpFri, 23 Apr 2010 01:22:24 +040022Friday 2010, 01:22:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132