У меня есть обертка вокруг бесформенной записи.
Я хочу извлечь значение из этой записи и доказать, что это экземпляр полиморфного типа, например List[_]
import shapeless._
import shapeless.record._
import shapeless.ops.record._
import shapeless.syntax.singleton._
case class All[L <: HList](containers: L) {
def getValue[Value, A](containerKey: Witness)
(implicit sel: Selector.Aux[L, containerKey.T, Value],
equiv: Value =:= List[A]
): List[A] =
equiv.apply(containers.get(containerKey))
}
Прямо сейчас я могу позвонить getValue
, если я явно укажу параметры типа Value
и A
, но, поскольку я работаю с гораздо более сложными типами, чем List
, мне действительно нужны эти параметры типа длябыть выведен.
val all = All(
'x ->> List[Int](1, 2, 3) ::
'y ->> List[String]("a", "b") ::
'z ->> 90
HNil
)
// doesn't compile: Cannot prove that Value =:= List[A].
all.getValue('x)
// compiles
all.getValue[List[Int], Int]('x)
Есть ли способ извлечь значение, принудительно привести его к, например, List[_]
, при этом не нужно указывать какие-либо параметры типа?
Обратите внимание, что эта стратегия работает полностьюхорошо, если я хочу доказать, что значение является простым мономорфным типом, например Value =:= Int
, но не для Value =:= List[A]