Estoy intentando parametrizar algunos métodos con parámetros de tipo muy generales.Tipos de Scala: menos límites superiores
Como un ejemplo, en el REPL I primero definir:
trait Term
case class FunctionalTerm[+T <: Term](t: T) extends Term
Intuitivamente, el siguiente método toma un plazo y un FunctionalTerm, y devuelve algo con el tipo de la cota superior mínima del tipo de término pasado y el tipo de argumento de FunctionalTerm:
def ex1[T1 <: Term, T3 <: X, FunctionalTerm[T1] <: X, X <: R, R <: Term](t1: FunctionalTerm[T1], s: T3): R = sys.error("TODO")
Hasta ahora todo bien en el REPL.
Entonces definen ex2
como una función de conveniencia que realiza la misma operación como ex1
, pero con los argumentos de entrada intercambiados:
def ex2[T2 <: Term, T3 <: X, FunctionalTerm[T2] <: X, X <: R, R <: Term](s: T3, t2: FunctionalTerm[T2]): R = ex1(t2,s)
El intento de definir ex2
en el REPL da el siguiente error:
error: inferred type arguments [T2,T3,FunctionalTerm,T3,T3] do not conform to method ex1's type parameter bounds [T1 <: Term,T3 <: X,FunctionalTerm[T1] <: X,X <: R,R <: Term]
ex1(t2,s)
^
error: type mismatch;
found : FunctionalTerm[T2]
required: FunctionalTerm[T1]
ex1(t2,s)
^
error: type mismatch;
found : T3(in method ex2)
required: T3(in method ex1)
ex1(t2,s)
^
error: type mismatch;
found : R(in method ex1)
required: R(in method ex2)
ex1(t2,s)
^
He pasado aproximadamente dos días tratando de encontrar una solución, y ahora estoy totalmente atascado. No puedo encontrar nada más en Google.
Desde la lista de argumentos de tipo ex2
es el mismo que el de ex1
pero con T1
y T2
intercambiado, no entiendo que está mal, o cómo solucionarlo.
¡Cualquier ayuda sería muy apreciada!
actualización
menos límites superiores eran una cortina de humo. El ejemplo se puede destilar más.
Las siguientes dos funciones se pueden definir en el REPL sin error:
def ex1[T1 <: Term, FunctionalTerm[T1] <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex1")
def ex2[T2 <: Term, FunctionalTerm[T2] <: Term](t2: FunctionalTerm[T2]): Term = ex1(t2)
Al presentar el parámetro extra X
parece ser la causa del problema. Puedo definir lo siguiente en el REPL:
def ex3[T1 <: Term, FunctionalTerm[T1] <: X, X <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex3")
Pero tratar de definir posteriormente:
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
da el error:
error: inferred type arguments [T2,FunctionalTerm,Nothing] do not conform to method ex3's type parameter bounds [T1 <: Term,FunctionalTerm[T1] <: X,X <: Term]
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
^
error: type mismatch;
found : FunctionalTerm[T2]
required: FunctionalTerm[T1]
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
^
lo tanto, supongo que la pregunta es: ¿Por qué el parámetro X
no utilizado en la firma tiene este efecto?
me olvidó decir que estoy usando Scala 2.10-M3. –
No está utilizando tipos superiores, aunque :-) –
@oxbow_lakes Oh ... corregiré –