如何从多态类型字段加载隐式清单
How to load implicit Manifest from polymorphic type field
我正在尝试为我的 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 中加载清单。
有更好的方法吗?
记住 T: Manifest
只是一种 shorthand 编写隐式构造函数参数的方法。如果你想让这个参数对外部可见,只需将它设为 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
)。
我正在尝试为我的 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 中加载清单。
有更好的方法吗?
记住 T: Manifest
只是一种 shorthand 编写隐式构造函数参数的方法。如果你想让这个参数对外部可见,只需将它设为 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
)。