【问题标题】:Scala Shapeless - Iterating/reading each item of Generic.Repr or converting it to HListScala Shapeless - 迭代/读取 Generic.Repr 的每个项目或将其转换为 HList
【发布时间】:2017-03-14 15:36:21
【问题描述】:

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

Generic 是一种转换案例类别和产品类型的简单方法(例如 tuples) 到 HList,反之亦然:

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 读取每个元素?

【问题讨论】:

  • 您提供的代码可能无法传达您遇到的问题。因为在这段代码中 h.headh.tail 工作得很好。
  • 我尝试使用 intellij ide 而不是 repl,如果我执行 h.head,则会显示“无法解析符号头”。但是,它遵守得很好。可能是ide的问题。感谢您指出。 :)
  • 哦,是的,那可能只是 IDE 在隐式和宏方面存在问题。

标签: scala shapeless


【解决方案1】:

在这种情况下,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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多