【发布时间】:2015-10-16 11:39:39
【问题描述】:
我正在尝试使用 Shapeless 解决 [this][1] 问题,总而言之,它是将嵌套案例类转换为 Map[String,Any],示例如下:
case class Person(name:String, address:Address)
case class Address(street:String, zip:Int)
val p = Person("Tom", Address("Jefferson st", 10000))
目标是将p 转换为关注:
Map("name" -> "Tom", "address" -> Map("street" -> "Jefferson st", "zip" -> 10000))
我正在尝试使用 Shapeless LabelledGeneric 来实现,这是我目前所拥有的:
import shapeless._
import record._, syntax.singleton._
import ops.record._
import shapeless.ops.record._
def writer[T,A<:HList,H<:HList](t:T)
(implicit lGeneric:LabelledGeneric.Aux[T,A],
kys:Keys.Aux[A,H],
vls:Values[A]) = {
val tGen = lGeneric.to(t)
val keys = Keys[lGeneric.Repr].apply
val values = Values[lGeneric.Repr].apply(tGen)
println(keys)
println(values)
}
我正在尝试让递归编写器检查每个值并尝试为值中的每个元素制作 Map。上面的代码工作正常,但是当我想用示例 Poly 迭代 values 时,使用下面的代码我得到了这些错误。
values.map(identity)
//or
tGen.map(identity)
Error:(75, 19) could not find implicit value for parameter mapper: shapeless.ops.hlist.FlatMapper[shapeless.poly.identity.type,vls.Out]
values.flatMap(identity)
^
Error:(75, 19) not enough arguments for method flatMap: (implicit mapper: shapeless.ops.hlist.FlatMapper[shapeless.poly.identity.type,vls.Out])mapper.Out.
Unspecified value parameter mapper.
values.flatMap(identity)
^
我不知道为什么会出现这个错误。我也很高兴知道是否有更简单的方法来使用 Shapeless 完成整个工作。 [1]:Scala macros for nested case classes to Map and other way around
【问题讨论】: