Ist es möglich, die Größe einer Vector
zu einer Methode zur Kompilierzeit übergeben zu erzwingen? Ich möchte eine Sammlung von Punkten in dem Raum einen n-dimensionale euklidischen Raum modellieren verwenden, die etwa wie folgt aussieht (das ist, was ich habe jetzt):Scala - Erzwingen der Größe von Vektor zur Kompilierzeit
case class EuclideanPoint(coordinates: Vector[Double]) {
def distanceTo(desination: EuclieanPoint): Double = ???
}
Wenn ich eine Koordinate, die über EuclideanPoint(Vector(1, 0, 0))
erstellt werden, es ist ein 3D Euklidischer Punkt. In Anbetracht dessen möchte ich sicherstellen, dass der Zielpunkt, der in einem Aufruf an distanceTo
übergeben wird, von derselben Dimension ist.
Ich weiß, ich kann dies tun, indem Tuple1
-Tuple22
, aber ich möchte viele verschiedene geometrische Räume darzustellen, und ich würde 22 Klassen für jeden Raum schreiben, wenn ich es mit Tuple
s hat - gibt es einen besseren Weg?
Ich kann nicht in gutem Bewusstsein dies zu einer _answer_, aber es könnte als eine Idee qualifizieren ... Das erste, was mir eingefallen ist, eine Value Class (neu in 2.10) mit Pfad-abhängigen Typen zu bekommen ein Typ, der eine bestimmte ganze Zahl darstellt. Ich habe keine Ahnung, ob das funktionieren könnte. Ich könnte es versuchen, wenn die Arbeit für den Tag vorbei ist ... Siehe SIP 15: http://docs.scala-lang.org/overviews/core/value-classes.html –
Diese Art von Constraint kann mit codiert werden "Typ-Level-Programmierung". Siehe zum Beispiel die [Apocalyp-Blogserie] (http://apocalisp.wordpress.com/2010/06/08/type-level-programming-in-scala/) und insbesondere HList. –