Cosa si intende per tipi dipendenti dal percorso di Scala?


125

Ho sentito che Scala ha tipi dipendenti dal percorso. Ha a che fare con le classi interne, ma cosa significa in realtà e perché me ne importa?


2
@Michel - So anche cosa sono i PDT; Speravo che SO potesse essere arricchito con una risposta!
oxbow_lakes,

1
Spero che ci sia una risposta tersamente dopo aver letto ch12 sul PDT
impilatore il

Risposte:


165

Il mio esempio preferito:

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

Quindi, il tipo di Coordinatedipende dall'istanza Boardda cui è stata istanziata. Ci sono tutti i tipi di cose che possono essere realizzati con questo, dando una sorta di sicurezza del tipo che dipende dai valori e non solo dai tipi.

Potrebbe sembrare un tipo dipendente, ma è più limitato. Ad esempio, il tipo di occupieddipende dal valore di Board. Sopra, l'ultima riga non funziona perché il tipo di c2è b2.Coordinate, mentre occupiedil tipo è Set[b1.Coordinate]. Si noti che è possibile utilizzare un altro identificatore con lo stesso tipo di b1, quindi non è l' identificatore b1 associato al tipo. Ad esempio, i seguenti lavori:

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

2
+1 per la risposta. Ho trovato confusa l'ultima frase: dici "digita la sicurezza che dipende dai valori e non solo dai tipi". Per me questo suona come tipi dipendenti, ma i tipi dipendenti dal percorso non dipendono dai valori in sé. Pensi che sia anche confuso?
Matthew Farwell,

4
@ Matteo Capisco quello che stai dicendo, ma dipendente dal percorso tipi fare dipendono dai valori, anche se non fornisce la flessibilità normalmente associati con tipi dipendenti.
Daniel C. Sobral,

1
Esatto, ecco cosa intendo. Inizialmente ho letto che il tipo dipendeva dai valori passati al costruttore, non da b1 / b2. Lo capisco ora, ma mi ci sono voluti un paio di letture per farlo.
Matthew Farwell,

3
La spiegazione più semplice è che i tipi dipendenti dal percorso sono solo classi con chiusure, esattamente allo stesso modo in cui le funzioni possono associare le variabili all'ambito.
polkovnikov.ph,

1
Ma forse c'è una differenza fondamentale in questa analogia: un'associazione ha luogo in fase di esecuzione (per chiusure) e l'altra associazione avviene in fase di compilazione (per tipi dipendenti dal percorso).
jhegedus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.