代码之家  ›  专栏  ›  技术社区  ›  Terry Dactyl

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

  •  0
  • Terry Dactyl  · 技术社区  · 6 年前

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

    我正在使用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) // B(2.0, true)
    

    我希望能够在产品上拉皮条,这样我就可以做以下事情:

    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. 我必须显式地提供tohlist的类型。

    2. 我需要操作fromHlistInstance(可能通过索引选择值),然后确保它是ToHListT类型。

    1. 有谁能告诉我如何操作(从hlistt中删除项,从hlistt重新排序)并转换为ToHListT的实例吗。
    0 回复  |  直到 6 年前
        1
  •  0
  •   Dmytro Mitin    6 年前

    你应该阅读“无形宇航员指南”的“6.3案例研究:案例类迁移”一章 https://books.underscore.io/shapeless-guide/shapeless-guide.html#sec:ops:migration

    也不是隐式的 g: Generic.Aux[A, B] 你可以尝试使用隐式 g: Generic[A] 和类型 g.Repr 而不是 B .