Scala 无形case类转换

Scala 无形case类转换,scala,shapeless,Scala,Shapeless,我使用shapeless进行case类转换, 我有两个案例: import shapeless._ case class Foo(id: Int, name: String) case class Bar(id: Int, name: String, price: Double) val fooGen = Generic[Foo] val barGen = Generic[Bar] val foo = Foo(1, "foo") val fooRepr = fooGen.to(foo) v

我使用shapeless进行case类转换, 我有两个案例:

import shapeless._

case class Foo(id: Int, name: String)
case class Bar(id: Int, name: String, price: Double)

val fooGen = Generic[Foo]
val barGen = Generic[Bar]

val foo = Foo(1, "foo")
val fooRepr = fooGen.to(foo)
val additional = fooRepr :+ 1.0
val bar = barGen.from(additional)
这很好,但当我尝试将Bar转换为Foo时

fooGen.from(barGen.to(bar))
我得到一个错误:

found   : main.barGen.Repr
[error]     (which expands to)  shapeless.::[Int,shapeless.::    [String,shapeless.::[Double,shapeless.HNil]]]
[error]  required: main.fooGen.Repr
[error]     (which expands to)  shapeless.::[Int,shapeless.::[String,shapeless.HNil]]
[error]   println(fooGen.from(barGen.to(bar)))    

是否可以转换一个case类,其中的字段比另一个case类中的字段多?

类似于调整
Foo
HList
表示,通过添加一个元素,您还必须通过删除额外的元素来调整
Bar
HList
表示:

fooGen.from(barGen.to(bar).take(2))
take
接受一个
Nat
参数,这行代码使用从
Int
文本到
Nat
类型级自然数的隐式转换


您可以在中的
HList
s上找到其他可用方法。

我的答案基于Travis Brown之前提出的一个类似问题

import shapeless._, ops.hlist._, ops.record._

class SameFieldConverter[T] {
    def apply[S, SR <: HList, TR <: HList, MR <: HList, IR <: HList](s: S)(implicit
      genS: LabelledGeneric.Aux[S, SR],
      genT: LabelledGeneric.Aux[T, TR],
      merger: Merger.Aux[SR, HNil, MR],
      intersection: Intersection.Aux[MR, TR, IR],
      align: Align[IR, TR]) = genT.from(intersection(merger(genS.to(s), HNil)))
  }
// defined class SameFieldConverter

def convertTo[T] = new SameFieldConverter[T]
//defined function convertTo

case class Foo(one: String, two: Int, three: Boolean)
// defined class Foo

case class Bar(three: Boolean, one: String)
// defined class Bar

convertTo[Bar](Foo("One", 2, false))
// res26: Bar = Bar(false, "One")
import shapeless.u,ops.hlist.u,ops.record_
类SameFieldConverter[T]{

def apply[S,SR]您可以链接到Travis Brown的原始答案吗?