È possibile applicare la dimensione di uno Vector
a un metodo in fase di compilazione? Voglio modellare uno spazio n-dimensionale euclideo utilizzando una raccolta di punti nello spazio che sembra qualcosa di simile (questo è quello che ho adesso):Scala - Imposizione della dimensione del vettore al momento della compilazione
case class EuclideanPoint(coordinates: Vector[Double]) {
def distanceTo(desination: EuclieanPoint): Double = ???
}
Se ho una coordinata che viene creato tramite EuclideanPoint(Vector(1, 0, 0))
, è un punto euclideo in 3D. Detto questo, voglio assicurarmi che il punto di destinazione passato in una chiamata a distanceTo
sia della stessa dimensione.
so che posso farlo utilizzando Tuple1
-Tuple22
, ma voglio rappresentare molti spazi geometrici diversi e avrei scritto 22 classi per ogni spazio, se l'ho fatto con Tuple
s - c'è un modo migliore?
Non riesco a capire che è un _answer_, ma potrebbe essere considerato un'idea ... La prima cosa che mi è venuta in mente è combinare una classe Value (nuova in 2.10) con tipi path-dependent per ottenere un tipo che rappresenta il numero intero s specifico. Non ho idea reale se questo potrebbe essere fatto funzionare. Potrei fare un tentativo quando il lavoro è finito per il giorno ... Vedi SIP 15: http://docs.scala-lang.org/overviews/core/value-classes.html –
Questo tipo di vincolo può essere codificato con "programmazione a livello di carattere". Vedi, per esempio, la [serie di blog di Apocalisp] (http://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/), e in particolare HList. –