Scala Shapeless - 迭代/读取 Generic.Repr 的每个项目或将其转换为 HList

标签 scala 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 中没有任何可用的方法.在这里,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$3$1@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

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

关于Scala Shapeless - 迭代/读取 Generic.Repr 的每个项目或将其转换为 HList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42778251/

相关文章:

scala - 使用 shapeless Mapper 无需指定结果类型

scala - 如何使用 HList 验证输入?

scala - 在 Scala 中的案例类上应用递归操作

具有额外约束的 Scala 无形 KList

scala - 在另一个数据帧的转换中创建/访问数据帧

scala - 将带有结构类型键的映射传递到 Spark UDF

scala - Play Framework 2 模板表单 None.get

scala - 为什么 Scala 中没有 i++?

scala - 如何使用 Shapeless 提取字段名称?

Scala:在for循环中声明val,如果条件