Що мається на увазі під типом Scala, що залежить від шляху?


125

Я чув, що Scala має типи, що залежать від шляху. Це щось спільне з внутрішніми класами, але що це насправді означає і чому мене це хвилює?


2
@Michel - я навіть знаю, що таке PDT; Я сподівався, що ТАК можна буде збагатити відповіддю!
oxbow_lakes

1
Я сподіваюсь, що після прочитання ch12 про PDT
укладальник

Відповіді:


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. Вище, останній рядок не працює, тому що тип c2є b2.Coordinate, а occupiedтип 'є Set[b1.Coordinate]. Зауважте, що можна використовувати інший ідентифікатор з тим самим типом b1, тому не той ідентифікатор b1 асоціюється з типом. Наприклад, такі роботи:

val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3

2
+1 для відповіді. Я знайшов останнє речення заплутаним: ви говорите "тип безпеки, який залежить від значень, а не типів". Для мене це звучить як залежні типи, але типи, що залежать від шляху, не залежать від значень самі по собі. Як ви вважаєте, це також заплутано?
Меттью Фарвелл

4
@Matthew Я розумію, про що ви говорите, але типи, що залежать від шляху , залежать від значень, навіть якщо це не забезпечує гнучкість, зазвичай пов'язану із залежними типами.
Даніель К. Собрал

1
Саме так я і маю на увазі. Спочатку я читав, що тип залежав від значень, переданих конструктору, а не b1 / b2. Я зараз це розумію, але мені знадобилося кілька прочитань.
Меттью Фарвелл

3
Найпростіше пояснення полягає в тому, що типи, що залежать від шляху, - це просто класи з закриттями, точно так само функції можуть пов'язувати змінні зі сферою.
polkovnikov.ph

1
Але, можливо, є одна принципова відмінність цієї аналогії: одна прив'язка відбувається під час виконання (для закриття), а інша прив'язка відбувається під час компіляції (для типів, залежних від шляху).
jhegedus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.