Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как сделать неявное преобразование типов, используемых в моем интерпретаторе

Автор вопроса: TalaОтветов: 1

Я пишу интерпретатор и пробовал использовать решение из how-to-set-up-implicit-conversion-to-allow-arithmetic-between-numeric-types для той же проблемы. Мне нужно добавить логическое + логическое значение, Int + логическое значение. , Boolean + Int, Int + Double, Double + Double и т. Д.

Поэтому я использовал классы WeakConformance и C из этого решения.

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)))
      }
    }

а вот часть моего переводчика

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("...")
    }
  }

}

ошибка такая

ошибка: неоднозначные неявные значения: // показывает 2 последних объекта, объявленных как неявные в признаке Numeric, здесь соответствуют ожидаемому типу Numeric[WeakLub]

есть идеи, как заставить его работать? Я хотел, чтобы метод eval возвращал C, но поскольку C[Int] не является экземпляром C[Any], это не решает мою проблему

typesscalaimplicit

Ответы

Ответ 1 · рейтинг 1 · Daniel C. Sobral

Из-за стирания типа вы не можете получить во время выполнения параметр типа C. Вам нужно будет использовать манифесты для хранения этой информации. См. Вопросы, связанные со стиранием манифеста и типа.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы