Soy bastante nuevo en Scala. Quiero escribir varios objetos matemáticos (Complejo, Polinomio, etc.) que se cierran bajo algunas operaciones (+, -, *) de forma que se pueden usar en genéricos y se pueden usar moldes implícitos.Números de implementación
Parece que he resuelto el primer bit.
trait GroupUnderAddition[T] {
def + (t : T) : T
}
case class Real(d : Double) extends GroupUnderAddition[Real] {
def + (r : Real) = Real(d + r.d)
}
case class Complex(re : Double, im : Double) extends GroupUnderAddition[Complex] {
def + (c : Complex) = Complex(re + c.re, im + c.im)
}
object Test {
implicit def real_to_complex(r : Real) = Complex(r.d, 0)
def test[G <: GroupUnderAddition[G]](a : G, b : G) = a + b
def main(args : Array[String]) {
println(test(Real(5), Real(2)))
}
}
Ahora, ¿cómo puedo escribir test() de manera que
test(Real(5), Complex(2, 1))
vuelve complejo (7, 1)?
Claro que podría hacer esto, pero quiero mantener los genéricos. Haciéndolo a tu manera, si quisiera llamar a prueba con dos polinomios, necesitaría reescribir todo. –
Sí, pero tiene 2 problemas diferentes, el primero es que desea crear el genérico 'GroupUnderAddition' que implementaría el método' + '. Por otro lado, desea tener un 'GroupUnderAddition' específico que implemente 2 tipos diferentes de números:' Real' y 'Complex'. Entonces tienes que hacer otro truco, es por eso que pensaste en 'def implícita', pero en tu caso no encontré una solución con esto. –