Scala Shapeless - Iterating/reading Generic.Repr 的每个项目或将其转换为 HList

Scala Shapeless - Iterating/reading each item of Generic.Repr or converting it to HList

我正在学习 shapeless 并参考 here 中的教程。其中说,

Generic is a simple way to convert case class and product types (like tuples) to HList, and vice-versa:

import shapeless.Generic

case class UserWithAge(name: String, age: Int)
val gen = Generic[UserWithAge]
val u = UserWithAge("Julien", 30)

val h = gen.to(u)

现在如果我打印 h,我将得到 Julien :: 30 :: HNil。但是,我无法读取 h 中的每个元素,例如 h.headh.tail 将不起作用,并且 h 中没有任何可用的方法。在这里,hgen.Repr 的类型,我也想不出将其转换为 HList 的方法。那么,如何从 h?

读取每个元素

在这种情况下,gen.to(u) 的类型是 gen.Repr,如果您查看 gen 的类型,它实际上扩展为 String :: Int :: HNil,所以它已经是 HList!

scala> import shapeless.Generic
import shapeless.Generic

scala> case class UserWithAge(name: String, age: Int)
defined class UserWithAge

scala> val gen = Generic[UserWithAge]
gen: shapeless.Generic[UserWithAge]{type Repr = shapeless.::[String,shapeless.::[Int,shapeless.HNil]]} = anon$macro@4ff329b8

scala> val u = UserWithAge("Julien", 30)
u: UserWithAge = UserWithAge(Julien,30)

scala> val h = gen.to(u)
h: gen.Repr = Julien :: 30 :: HNil

scala> h.head
res0: String = Julien

scala> h.tail
res1: shapeless.::[Int,shapeless.HNil] = 30 :: HNil

在一般情况下,GenericRepr 类型将是 HListCoproduct。有关如何对这些进行通用编程的示例,请参阅 shapeless-type-class-derivation-2015-demo