使用 Shapeless 展平包含 case class 元素的任意嵌套元组

Flattening arbitrarily nested tuples containing case class elements using Shapeless

我用了下面的例子:

https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapeless/examples/flatten.scala

展平元组。但是我现在意识到 case 类 也变平了。他们有什么办法可以确保只有元组被展平吗?

TIA

你可能需要一个隐含的 IsTuple:

object flatten extends LowPriorityFlatten {
  implicit def caseTuple[P <: Product : IsTuple]
      (implicit lfm: Lazy[FlatMapper[P, flatten.type]]) =
    at[P](lfm.value(_))
}

测试:

val v4 = (Bar(Foo("a")), (true, 2.0, "foo"))
val f4 = flatten(v4)
typed[(Bar, Boolean, Double, String)](f4)