3 votes

comment faire une conversion implicite des types utilisés dans mon interpréteur

J'écris un interprète et j'ai essayé d'utiliser la solution de Comment configurer la conversion implicite pour permettre l'arithmétique entre les types numériques ? pour le même problème, je dois pouvoir ajouter Booléen + Booléen, Int + Booléen, Booléen + Int, Int + Double, Double + Double, etc.

J'ai donc utilisé les classes WeakConformance et C de cette solution.

sealed trait WeakConformance[A <: AnyVal, B <: AnyVal, C] {
  implicit def aToC(a: A): C

  implicit def bToC(b: B): C
}

object WeakConformance {
  implicit def SameSame[T <: AnyVal]: WeakConformance[T, T, T] = new WeakConformance[T, T, T] {
    implicit def aToC(a: T): T = a

    implicit def bToC(b: T): T = b
  }

  implicit def IntDouble: WeakConformance[Int, Double, Double] = new WeakConformance[Int, Double, Double] {
    implicit def aToC(a: Int) = a

    implicit def bToC(b: Double) = b
  }

  implicit def DoubleInt: WeakConformance[Double, Int, Double] = new WeakConformance[Double, Int, Double] {
    implicit def aToC(a: Double) = a

        implicit def bToC(b: Int) = b
      }
   }  

   case class C[A <: AnyVal](val value:A) {
          import WeakConformance.unify
          def +[B <: AnyVal, WeakLub <: AnyVal](that:C[B])(implicit wc: WeakConformance[A, B, WeakLub], num: Numeric[WeakLub]): C[WeakLub] = {  
        new C[WeakLub](num.plus(wc.aToC(x), wc.bToC(y)))
      }
    }

et voici une partie de mon interprète

class Interpreter {

......

  def eval(e: Expression): Any = e match {
  ...

    case ADD(lhs, rhs) => (eval(lhs), eval(rhs)) match {

      case (l: C[_], r: C[_]) => l + r  // error comes here

      case _ => error("...")
    }
  }

}

l'erreur se présente comme suit

erreur : valeurs implicites ambiguës : // montre les 2 derniers objets déclarés comme implicites en Numeric le trait correspond ici au type attendu Numeric[WeakLub]

Comment faire pour que cela fonctionne ? Je voulais que la méthode eval renvoie C mais comme C[Int] n'est pas une instance de C[Any] cela ne résout pas mon problème

1voto

Daniel C. Sobral Points 159554

En raison de l'effacement de type, vous ne pouvez pas récupérer à l'exécution le paramètre de type de C . Vous devrez utiliser des manifestes pour stocker ces informations. Voir les questions relatives à l'effacement des manifestes et des types.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X