Функция ограничения, основанная на происхождении (тип, зависящий от пути? Тип поколения?)

Извините за ужасный заголовок, но не уверен в лучшем. Вот грубое упрощение моей проблемы (извините, если это кажется настолько тривиальным, что это бессмысленно):

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

ИдеяRList (Ограниченный список) заключается в том, что вы не можете изменить его размер или изменить порядок элементов в нем. Но вы можете использовать функции, которые дают вам новый RList с измененными данными в нем.

Теперь должна быть функция, которая создает RLists. Это может иметь подписьsomething лайк:

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

Все идет нормально. Но теперь сложная часть. Мне нужна функция, которая работаетlike этот:

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

Но с дополнительным ограничением, котороеleft а такжеright имеют одинаковое происхождение. Таким образом, они гарантированно будут одинакового размера.

например Код, который должен скомпилировать:

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

например Код, который должен потерпеть неудачуto compile

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

*Note: In my original problem the constraint on zip needs to be that they are from the same 'source'. Merely guaranteeing they are the same length isn't good enough (Not to mention, the size of the list isn't known at compile time) *

Я также должен иметь возможность использоватьzip несколько раз, так что-то вроде этого должно скомпилировать

zip(a,zip(b,c))

(при условии,a, b а такжеc из того же источника)

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос