8
votes

Méthode générique convertible au type de structure dans Scala

Pourquoi ne puis-je pas faire cela: xxx

afin de comparer toute séquence de types convertible vers int ? Comment puis-je implémenter un modèle similaire?


mise à jour: cela doit exécuter Message.comPare (liste (1.0, 2.0, 3.0), liste (0, 0, 0))


0 commentaires

3 Réponses :


9
votes

Puisque vous traitez avec Array code> s, vous avez besoin classManifest code> s. xxx pré>

Le message d'erreur du compilateur dans ce cas ne pouvait pas 't être plus clair imo. p>

edit: strong> p>

Vous n'avez pas vraiment besoin de convertir des séquences en tableaux. Ce qui suit fonctionne simplement bien. P>

def compare[A <% { def toInt: Int }, 
            B <% { def toInt: Int }]
           (bs: Seq[A], is: Seq[B]): Boolean = { 
      (bs, is).zipped.forall(_.toInt == _.toInt)
}


3 commentaires

Étrange ... cela échoue: println (Message.comPare (liste (1, 2, 3), liste (0, 0, 0)))


@HUGOSFERREIRA: C'est vraiment étrange. Je suis désolé; Je ne sais pas comment se déplacer.


@Hugosferreira: Il semble être un bug.



2
votes

Ça fonctionne bien pour moi lorsque je supprimai l'inutile Toarray xxx

convertir le SEQ en une matrice nécessiterait que vous ajoutez une classe impliciteManifest, mais Scala ne fait pas Laissez-vous mélanger ceux avec les limites de la vue.


4 commentaires

Il échoue avec comparer (liste (2, 3), liste (2, 4))


Eh bien, les limites de la vue que vous définissez indiquent que les types A et B doivent être des cours qui ont une conversion implicite disponible sur un type de structure avec une méthode toint . 2, 3 etc. sont des entiers et la classe INT de Scala n'a pas de méthode de TOINT . Afin de faire fonctionner cela, vous devez définir une classe qui est essentiellement quel est mon exemple de classe B, puis crée une fonction de conversion implicite de Int vers B.


implicitement [int => {def toint: int}] réussit. Donc, le code compile, mais échoue au moment de l'exécution.


"Cependant, Scala ne vous permet pas de mélanger ceux avec des limites de vue." << Cela fait, pensait que ce n'est pas une solution au problème de l'OP.



2
votes

Un bon exemple d'où le problème des mensonges semblerait faire cela:

def compare[A : Numeric, B : Numeric](bs : Seq[A], cs : Seq[B]) = {
  (bs, cs).zipped.forall(implicitly[Numeric[A]].toInt(_) == implicitly[Numeric[B]].toInt(_))
}


0 commentaires