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

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

1 ответ

Решение

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

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
Другие вопросы по тегам