Qu’entend-on par types de chemin dépendant de Scala?

J’ai entendu dire que Scala a des types dépendant du chemin. C’est quelque chose à voir avec les classes internes mais qu’est-ce que cela signifie réellement et pourquoi est-ce que je m’en soucie?

Mon exemple préféré:

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 

Ainsi, le type de Coordinate dépend de l'instance de Board partir de laquelle il a été instancié. Il y a toutes sortes de choses qui peuvent être accomplies avec ceci, donnant une sorte de sécurité de type qui dépend des valeurs et pas seulement des types.

Cela peut sembler dépendant des types, mais il est plus limité. Par exemple, le type d' occupied dépend de la valeur de la Board . Au-dessus, la dernière ligne ne fonctionne pas car le type de c2 est b2.Coordinate , alors que le type occupied est Set[b1.Coordinate] . Notez que l'on peut utiliser un autre identifiant avec le même type de b1 , ce n'est donc pas l' identifiant b1 associé au type. Par exemple, les travaux suivants:

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