Einschränkungsfunktion basierend auf dem Ursprung (Pfadabhängiger Typ? Typgenerierung?)

Tut mir leid wegen des schrecklichen Titels, ich bin mir nicht sicher, ob es einen besseren gibt. Hier ist eine grobe Vereinfachung meines Problems (Sorry, wenn es so trivial erscheint, dass es sinnlos ist):

class RList[T](data: List[T]) {
   def map[V](f: T=>V): RList[V] = ...
}

Die Idee einesRList (Eingeschränkte Liste) bedeutet, dass Sie die Größe nicht ändern oder die Reihenfolge der darin enthaltenen Elemente ändern können. Sie können jedoch Funktionen verwenden, mit denen Sie eine neue RList mit geänderten Daten erhalten.

Jetzt muss es eine Funktion geben, die RListen erstellt. Es könnte eine Unterschrift habenetwas mögen:

def toRList[T](values: List[T]): RList[T] = ...

So weit, ist es gut. Aber jetzt der schwierige Teil. Ich brauche eine Funktion, die funktioniertmögen diese:

def zip[T, V](left: RList[T], right: RList[V]): RList[(T,V)]

Aber mit der zusätzlichen Einschränkung, dassleft undright haben den gleichen Ursprung. Somit haben sie garantiert die gleiche Größe.

z.B. Code, der kompiliert werden soll:

val x = toRList(List(1, 2, 3))
val y = x.map(_ * 2)
val z = y.map(_.toString)
zip(y,z)

z.B. Code, der fehlschlagen solltekompilieren

val y = toRList(List(2, 4, 6))
val z = toRList(List("one", "two"))
zip(y,z)

*Hinweis: In meinem ursprünglichen Problem muss die Einschränkung für zip sein, dass sie aus derselben 'Quelle' stammen. Nur zu garantieren, dass sie gleich lang sind, ist nicht gut genug (ganz zu schweigen davon, dass die Größe der Liste zum Zeitpunkt der Kompilierung nicht bekannt ist) *

Ich muss auch verwenden könnenzip mehrere Male, so sollte so etwas kompilieren

zip(a,zip(b,c))

vorausgesetzta, b undc sind aus der gleichen Quelle)

Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage