Función de restricción basada en el origen (¿Tipo de ruta dependiente? ¿Generación de tipo?)

Lo siento por el terrible título, no estoy seguro de uno mejor. Aquí hay una simplificación de mi problema (lo siento si parece tan trivial, que no tiene sentido):

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

La idea de unRList (Lista restringida) es que no puede cambiar su tamaño o cambiar el orden de los elementos que contiene. Pero puede usar funciones que le brinden un nuevo RList con datos modificados.

Ahora tiene que haber una función que crea listas de reproducción. Podría tener una firmaalguna cosa me gusta:

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

Hasta ahora tan bueno. Pero ahora la parte difícil. Necesito una funcion que funcioneme gusta esta:

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

Pero con la restricción adicional de queleft yright Tienen el mismo origen. Por lo tanto, se garantiza que sean del mismo tamaño.

p.ej. Código que debe compilar:

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

p.ej. Código que debería fallarcompilar

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

*Nota: en mi problema original, la restricción en zip debe ser que sean de la misma 'fuente'. El simple hecho de garantizar que tengan la misma longitud no es lo suficientemente bueno (sin mencionar que no se conoce el tamaño de la lista en el momento de la compilación) *

También necesito poder usarzip varias veces, así que algo como esto debería compilar

zip(a,zip(b,c))

(asumiendoa, b yc son de la misma fuente)

¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta