J'ai créé une classe qui peut être paramétrés par tout ce qui peut être converti en numériqueScala - conversion implicite de l'INT numérique [Int]
class Complex[T <% Numeric[T]] (val real : T, val imag : T) {
//... complex number methods ...
}
Ensuite ailleurs dans le code je tente:
var myComplex = new Complex(0, 1)
Cela soulève une erreur de compilation car (de manière surprenante) il n'y a pas de conversion implicite entre Int et Numeric [Int] ou même entre Int et Integral [Int].
Ai-je raté quelque chose? Y a-t-il une conversion implicite quelque part que je ne vois pas?
Il existe un objet implicite appelé IntIsIntegral défini dans Numeric.scala. Je l'ai essayé d'utiliser cette option pour créer ma propre méthode de conversion implicite:
def implicit intToNumericInt(val i : Int)(implicit n : IntIsIntegral) = n.fromInt(i)
Je suis surpris que cela est nécessaire et, de toute façon, il semble conduire à une récursion infinie dans la méthode .fromInt.
Je suis sûr qu'il me manque quelque chose de basique (comme vous pouvez le dire, je suis nouveau à Scala) donc j'apprécierais un point dans la bonne direction.
Comme vous pouvez le voir dans l'exemple, j'essaie de faire fonctionner une implémentation de nombres complexes qui peut accepter et travailler avec n'importe quel type numérique. J'espère contribuer au projet scalala (algèbre linéaire). Suite à cela, je veux introduire un trait qui décrit les responsabilités des éléments dans une matrice (principalement juste les opérateurs + et *) et le rattrapage de support pour les nombres complexes dans la bibliothèque de manipulation de la matrice.
D'après ce que je comprends, le: T <% numérique [T] est le sucre syntaxique pour ajouter le (implicite num: [T] Numérique) mais je suppose que l'utilisation du sucre signifie que je n'ai pas la variable disponible pour faire: importer num._ // rendre les conversions implicites disponibles J'ai effectivement essayé le (implicit num: Numeric [T]) out mais cela n'a pas fonctionné pour moi. Je rapporterai demain si l'importation num._ aide! Merci. –
@David: 'T <% Numeric [T]' est un sucre syntaxique pour ajouter '(implicite ev: T => Numérique [T])', et 'T: Numérique [T]' est un sucre syntaxique pour ajouter ' (ev implicite: Numérique [T]) '. Le premier s'appelle view bound, et le second s'appelle typeclass bound. – missingfaktor
@missingfaktor Le second est appelé un contexte lié, et arrive à être utilisé pour le modèle de classe de type. –