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.head
,h.tail
将不起作用,并且 h
中没有任何可用的方法。在这里,h
是 gen.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
在一般情况下,Generic
的 Repr
类型将是 HList
或 Coproduct
。有关如何对这些进行通用编程的示例,请参阅 shapeless-type-class-derivation-2015-demo。
我正在学习 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.head
,h.tail
将不起作用,并且 h
中没有任何可用的方法。在这里,h
是 gen.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
在一般情况下,Generic
的 Repr
类型将是 HList
或 Coproduct
。有关如何对这些进行通用编程的示例,请参阅 shapeless-type-class-derivation-2015-demo。