无形-泛型上下文中的泛型

时间:2019-03-12 15:39:20

标签: scala shapeless

这是我今天早些时候发表的帖子中的一个子问题。

我正在使用HList和Generic,希望在案例类之间执行一些隐式转换。

考虑:

case class A(a: Int, b: Double, c: Boolean)
case class B(b: Double, c: Boolean)

我可以非常简单地在两种类型之间进行转换:

Generic[B].from(Generic[A].to(A(1, 2.0, true)).tail) // B(2.0, true)

我希望能够在Product上使用一种方法,因此我可以执行以下操作:

A(1, 2.0, true).to[B]

我的尝试如下:

object ShapelessTest extends App {

  implicit class convert[From <: Product, FromHListT <: HList]
    (x: From)(implicit genFrom: Generic.Aux[From, FromHlistT]){

    def to[To <: Product, ToHlistT <: HList]
      (implicit genTo: Generic.Aux[To, ToHilstT]): To = {

      val fromHList = genFrom.to(x)

      val toHList = ??? // Manipulate toHList to correspond with type ToHListT

      genTo.from(toHList)
    }
  }

  println(C(1, 2.0, true).to[D, Double :: Boolean :: HNil])
}

现在我的代码不理想,有两个原因。

  1. 我必须明确提供To HList的类型。

  2. 我需要操纵FromHListT实例(也许通过索引选择值),然后确保它的类型为ToHListT。

有人在不指定第二类型参数的情况下如何获得Generic.Aux [T,ToHListT]有任何建议吗?

  1. 任何人都可以建议我如何操作(从中删除项目,对FromHListT重新排序)并转换为ToHListT实例。

0 个答案:

没有答案