Что предназначено зависимыми от предшествующего пути развития типами Scala?

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

117
задан oxbow_lakes 22 April 2010 в 17:32
поделиться

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

Итак, тип Координаты зависит от экземпляра Board из которого он был создан. С его помощью можно выполнить все виды вещей, обеспечивая своего рода безопасность типов, которая зависит от значений, а не только от типов.

Это может показаться зависимым типом, но оно более ограничено. Например, тип занятого зависит от значения Board . Выше последняя строка не работает, потому что тип c2 - b2.Coordinate , а тип занято - Set [b1. Координата] . Обратите внимание, что можно использовать другой идентификатор с тем же типом b1 , поэтому с типом связан не идентификатор b1 . Например, следующие работы:

val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3
157
ответ дан 24 November 2019 в 02:08
поделиться
Другие вопросы по тегам:

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