Je suis assez nouveau à Scala. Je veux écrire plusieurs objets mathématiques (complexe, polynôme, etc.) qui sont fermés sous certaines opérations (+, -, *) d'une manière qu'ils peuvent être utilisés en génériques et que des moules implicites peuvent être utilisées.
Je paraisse avoir résolu le premier bit. p> maintenant, comment puis-je écrire test () de sorte que p> retourne complexe (7, 1)? P> P>
3 Réponses :
L'idée principale est que toutes les groupumberadditions ne sont pas compatibles, de sorte que vous semblez vouloir travailler avec une algèbre complexe, je suggérerais de construire une superclasse comprenant Goupunderaddition. Cependant, il n'est pas recommandé de faire une classe de cas (voir avertissements si vous avez un Classe de cas Code> Extension d'une classe de cas code>) trait GroupUnderAddition[T] {
def + (t : T) : T
}
class ComplexAlgebra(_re:Double, _im:Double) extends(GroupUnderAddition[ComplexAlgebra]) {
val re = _re
val im = _im
def + (c : ComplexAlgebra) = new ComplexAlgebra(re + c.re, im + c.im)
}
case class Real(d : Double) extends ComplexAlgebra(d, 0)
case class Complex(real : Double, imaginary : Double) extends ComplexAlgebra(real,imaginary)
object Test {
def test(a : ComplexAlgebra, b : ComplexAlgebra) = a + b
def main(args : Array[String]) {
println(test(Real(5), Real(2)))
}
}
Bien sûr, je pouvais faire cela, mais je veux garder des génériques. Le faire à votre façon, si je voulais appeler test avec deux polynômes, je devrais réécrire le tout.
Oui, mais vous avez 2 problèmes différents, le premier est que vous souhaitez créer le GRANDIC groupuméaddition code> qui implémenterait la méthode + code>. D'autre part, vous souhaitez avoir un spécifique (code> Mise en œuvre de 2 types de numéros différents: réel code> et complexe code>. Donc, vous avez à un autre tour, c'est pourquoi vous avez pensé à implicite def code> mais dans votre cas, je n'ai pas trouvé de solution avec cela.
Le problème est que le Par conséquent, si vous avez quelque chose comme Si vous avez une méthode comme si vous avez une méthode comme : Si vous Voulez-vous appliquer une conversion implicite, vous devez spécifier votre méthode de sorte que ses arguments puissent être convertis. Pour la méthode ci-dessus implicite def code> n'est pas pris en compte pour la conversion des arguments, sauf si vous spécifiez la définition de la méthode à le faire. réel (5 ) .foo code> et foo code> est défini uniquement pour complexe, le implicit code> fonctionnera pour cela. p> def fio (C: complexe) = ... code> Vous ne pouvez pas l'appeler avec foo (réel (5)) code> à la place. P> FOO code>, vous pouvez le faire comme ceci: p> println(test[Complex,Real,Complex](Real(5), Complex(2, 1)))
println(test[Complex,Complex,Real](Complex(2,1), Real(5)))
Le vrai problème ici est que vous faites l'hypothèse (incorrecte) que test (réel (5), complexe (2, 1)) code> est bien défini de quelque manière que ce soit, étant donné quoi vous avez écrit. Considérez ce qui suit: case class Word(s : String) extends GroupUnderAddition[Word] {
def +(w : Word) = Word(s + w.s)
}
Test (réel (5), complexe (2, 1)) est bien défini, étant donné que j'ai une fonction de réalité implicite => complexe. Je n'essaie pas de faire ce travail pour deux enfants de groupumberaddition.