Função de restrição baseada na origem (tipo Dependente do Caminho? Geração de Tipo?)

Desculpe pelo título terrível, não tenho certeza de um melhor. Aqui está uma simplificação grosseira do meu problema (desculpe se parece tão trivial, que é inútil):

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

A ideia de umRList (Lista Restrita) é que você não pode redimensioná-la ou alterar a ordem dos elementos nela. Mas você pode usar funções que lhe dão um novo RList com dados alterados nele.

Agora, precisa haver uma função que crie RLists. Pode ter uma assinaturaalguma coisa gostar:

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

Por enquanto, tudo bem. Mas agora a parte complicada. Eu preciso de uma função que funcionegostar isto:

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

Mas com a restrição adicional queleft eright tem a mesma origem. Assim, eles são garantidos para ser do mesmo tamanho.

por exemplo. Código que deve compilar:

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

por exemplo. Código que deve falharcompilar

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

*Nota: No meu problema original, a restrição no zip precisa ser que eles são da mesma 'fonte'. Apenas garantindo que eles são do mesmo tamanho não é bom o suficiente (para não mencionar, o tamanho da lista não é conhecido em tempo de compilação) *

Eu também preciso ser capaz de usarzip várias vezes, então algo assim deveria compilar

zip(a,zip(b,c))

(assumindoa, b ec são da mesma fonte)

Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion