根据类型递归地转换无形记录中的元素
Recursively transform elements in shapeless records based on type
我如何在 Record
上递归应用 Poly1
?我已经指出 everywhere
,但这似乎不适用于 Record
s。
object f extends Poly1 { implicit def atFoo = at[Foo](x => x) }
sealed trait Foo
case class Foo1(foo: Foo) extends Foo
case class Foo2(int: Int) extends Foo
def m = {
val generic = LabelledGeneric[Foo]
generic.from(everywhere(f)(generic.to(Foo1(Foo1(Foo2(3))))))
}
给我
[error] found : generic.Repr
[error] (which expands to) shapeless.:+:[Main.Foo1 with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("Foo1")],Main.Foo1],shapeless.:+:[Main.Foo2 with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("Foo2")],Main.Foo2],shapeless.CNil]]
[error] required: shapeless.poly.Case[_1.type,shapeless.HNil]{type Result = ?} where val _1: shapeless.EverywhereAux[Main.f.type]
[error] generic.from(everywhere(f)(generic.to(Foo1(Foo1(Foo2(3))))))
[error] ^
使用everywhere
时不需要直接调用LabelledGeneric
。它正在为您处理 HList 转换,因此您可以像 everywhere(f)(Foo1(Foo1(Foo2(3))))
那样调用它。我更改它以修改 Int 字段,以便您可以清楚地看到它的工作:
import shapeless._
object f extends Poly1 {
implicit def atFoo = at[Int](_ * 2)
}
sealed trait Foo
case class Foo1(foo: Foo) extends Foo
case class Foo2(int: Int) extends Foo
println(everywhere(f)(Foo1(Foo1(Foo2(3)))))
我如何在 Record
上递归应用 Poly1
?我已经指出 everywhere
,但这似乎不适用于 Record
s。
object f extends Poly1 { implicit def atFoo = at[Foo](x => x) }
sealed trait Foo
case class Foo1(foo: Foo) extends Foo
case class Foo2(int: Int) extends Foo
def m = {
val generic = LabelledGeneric[Foo]
generic.from(everywhere(f)(generic.to(Foo1(Foo1(Foo2(3))))))
}
给我
[error] found : generic.Repr
[error] (which expands to) shapeless.:+:[Main.Foo1 with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("Foo1")],Main.Foo1],shapeless.:+:[Main.Foo2 with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("Foo2")],Main.Foo2],shapeless.CNil]]
[error] required: shapeless.poly.Case[_1.type,shapeless.HNil]{type Result = ?} where val _1: shapeless.EverywhereAux[Main.f.type]
[error] generic.from(everywhere(f)(generic.to(Foo1(Foo1(Foo2(3))))))
[error] ^
使用everywhere
时不需要直接调用LabelledGeneric
。它正在为您处理 HList 转换,因此您可以像 everywhere(f)(Foo1(Foo1(Foo2(3))))
那样调用它。我更改它以修改 Int 字段,以便您可以清楚地看到它的工作:
import shapeless._
object f extends Poly1 {
implicit def atFoo = at[Int](_ * 2)
}
sealed trait Foo
case class Foo1(foo: Foo) extends Foo
case class Foo2(int: Int) extends Foo
println(everywhere(f)(Foo1(Foo1(Foo2(3)))))