使用静态 Nat HList 压缩通用 HList
Zip generic HList with static Nat HList
我正在寻找一种将两个 HList 压缩在一起的方法。第一个是从 case class 转换为通用表示生成的,第二个是手动定义为 Nat.
的 HList
因此,我希望得到一个元组(或 2 成员 HList),其中包含来自案例 class 的一个字段以及关联的 Nat。
目标是创建 "customizable" ZipWithIndex
。
def derive[A, I <: HList, R <: HList, Z <: HList](implicit
gen: Generic.Aux[A, R],
zipper: Zip.Aux[R, I, Z],
enc: Lazy[Encoder[Z]])(a: A): Deriver[A] = {
val genRepr = gen.to(A)
val zipped = zip(genRepr :: ??? :: HNil)
enc.value(zipped)
}
case class Foo(a: String, b: String, c: String)
derive[Foo, Nat._1 :: Nat._3 :: Nat.7 :: HNil]
结果必须匹配 encoderTuple[H, N <: Nat, T <: HList]: Encoder[(H, N) :: T]
或 encoderHList[H, N <: Nat, T <: HList]: Encoder[(H::N::HNil) :: T]
。
The goal is to create a "customizable" ZipWithIndex
.
我想标准 shapeless.ops.hlist.Zip 应该足够了:
trait Encoder[Z] {
type Out
def apply(z: Z): Out
}
object Encoder {
type Aux[Z, Out0] = Encoder[Z] { type Out = Out0 }
// implicits
}
trait Deriver[A]
object Deriver {
// implicits
}
def derive[A, I <: HList, R <: HList, Z <: HList](a: A, i: I)(implicit
gen: Generic.Aux[A, R],
zipper: Zip.Aux[R :: I :: HNil, Z],
enc: Lazy[Encoder.Aux[Z, Deriver[A]]]): Deriver[A] = {
val genRepr: R = gen.to(a)
val zipped: Z = zipper(genRepr :: i :: HNil)
enc.value(zipped)
}
case class Foo(a: String, b: String, c: String)
// derive[Foo, Nat._1 :: Nat._3 :: Nat._7 :: HNil, ???, ???]
derive(Foo("aaa", "bbb", "ccc"), Nat._1 :: Nat._3 :: Nat._7 :: HNil)
我正在寻找一种将两个 HList 压缩在一起的方法。第一个是从 case class 转换为通用表示生成的,第二个是手动定义为 Nat.
的 HList因此,我希望得到一个元组(或 2 成员 HList),其中包含来自案例 class 的一个字段以及关联的 Nat。
目标是创建 "customizable" ZipWithIndex
。
def derive[A, I <: HList, R <: HList, Z <: HList](implicit
gen: Generic.Aux[A, R],
zipper: Zip.Aux[R, I, Z],
enc: Lazy[Encoder[Z]])(a: A): Deriver[A] = {
val genRepr = gen.to(A)
val zipped = zip(genRepr :: ??? :: HNil)
enc.value(zipped)
}
case class Foo(a: String, b: String, c: String)
derive[Foo, Nat._1 :: Nat._3 :: Nat.7 :: HNil]
结果必须匹配 encoderTuple[H, N <: Nat, T <: HList]: Encoder[(H, N) :: T]
或 encoderHList[H, N <: Nat, T <: HList]: Encoder[(H::N::HNil) :: T]
。
The goal is to create a "customizable"
ZipWithIndex
.
我想标准 shapeless.ops.hlist.Zip 应该足够了:
trait Encoder[Z] {
type Out
def apply(z: Z): Out
}
object Encoder {
type Aux[Z, Out0] = Encoder[Z] { type Out = Out0 }
// implicits
}
trait Deriver[A]
object Deriver {
// implicits
}
def derive[A, I <: HList, R <: HList, Z <: HList](a: A, i: I)(implicit
gen: Generic.Aux[A, R],
zipper: Zip.Aux[R :: I :: HNil, Z],
enc: Lazy[Encoder.Aux[Z, Deriver[A]]]): Deriver[A] = {
val genRepr: R = gen.to(a)
val zipped: Z = zipper(genRepr :: i :: HNil)
enc.value(zipped)
}
case class Foo(a: String, b: String, c: String)
// derive[Foo, Nat._1 :: Nat._3 :: Nat._7 :: HNil, ???, ???]
derive(Foo("aaa", "bbb", "ccc"), Nat._1 :: Nat._3 :: Nat._7 :: HNil)