这是我今天早些时候发表的一篇文章中的一个子问题。
我正在使用HList和Generic,希望在case类之间执行一些隐式转换。
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)
我希望能够在产品上拉皮条,这样我就可以做以下事情:
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])
}
现在我的代码不够理想有两个原因。
-
我必须显式地提供tohlist的类型。
-
我需要操作fromHlistInstance(可能通过索引选择值),然后确保它是ToHListT类型。
-
有谁能告诉我如何操作(从hlistt中删除项,从hlistt重新排序)并转换为ToHListT的实例吗。