Как загрузить неявный Manifest из поля полиморфного типа

Я пытаюсь построить интерпретатор для моего ADT, но я не знаю, как решить проблему загрузки неявных манифестов хорошим способом.

sealed trait Polymorphic[T]
case class Type1[T: Manifest](field1: T) extends Polymorphic[T]
case class Type2[T: Manifest, V: Manifest](field1: T, field2:V) extends Polymorphic[T] {
    def vManifest: Manifest[V] = manifest[V]
}

object Interpreter {
    def eval[T: Manifest](polymorphic: Polymorphic[T]): T = {
      polymorphic match {
        case Type1(field) =>
          ???
        case value: Type2[T, _] =>
          implicit val vManifest = value.vManifest
          evalType2(value)
      }
    }

    def evalType2[T:Manifest, V:Manifest](type2: Type2[T,V]): T = ???
}

Это было лучшее решение, которое я мог создать, но мне не нравится, что мне пришлось создавать эту функцию vManifest, чтобы иметь возможность загружать манифест в eval.

Есть лучший способ сделать это?

1 ответ

Решение

Помните T: Manifest это просто сокращенный способ написания неявного аргумента конструктора. Если вы хотите сделать этот аргумент видимым снаружи, просто сделайте его val:

case class Type1[T](field1: T)(implicit val tManifest: Manifest[T]) extends Polymorphic[T]
case class Type2[T](field1: T, field2: V)(implicit val tManifest: Manifest[T], val vManifest: Manifest[V]) extends Polymorphic[T]

(и, скорее всего, в эти дни вы хотите ClassTag или же TypeTag скорее, чем Manifest).

Другие вопросы по тегам