Funkcja ograniczenia na podstawie pochodzenia (typ zależny od ścieżki? Generacja typu?)

Przepraszam za straszny tytuł, nie jestem pewien lepszego. Oto poważne uproszczenie mojego problemu (Przepraszam, jeśli wydaje się to takie trywialne, że nie ma sensu):

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

PomysłRList (Lista zastrzeżona) polega na tym, że nie można zmienić jej rozmiaru ani zmienić kolejności elementów w niej zawartych. Ale możesz użyć funkcji, które dają ci nową listę RList ze zmienionymi danymi.

Teraz musi istnieć funkcja, która tworzy listy RLists. Może mieć podpiscoś lubić:

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

Jak na razie dobrze. Ale teraz trudna część. Potrzebuję funkcji, która działalubić to:

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

Ale z dodatkowym ograniczeniemleft iright mają to samo pochodzenie. Gwarantuje to, że będą tego samego rozmiaru.

na przykład Kod, który należy skompilować:

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

na przykład Kod, który powinien zawieśćkompilować

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

*Uwaga: W moim pierwotnym problemie ograniczenie na zip musi być takie, że pochodzą z tego samego „źródła”. Samo zagwarantowanie, że są tej samej długości, nie jest wystarczająco dobre (nie wspominając, rozmiar listy nie jest znany w czasie kompilacji) *

Muszę też mieć możliwość korzystaniazip wiele razy, więc coś takiego powinno się skompilować

zip(a,zip(b,c))

(zarozumiałya, b ic są z tego samego źródła)

Dzięki!

questionAnswers(2)

yourAnswerToTheQuestion