使用静态Nat HList压缩通用HList(Zip generic HList with static Nat HList)

编程入门 行业动态 更新时间:2024-10-19 19:46:36
使用静态Nat HList压缩通用HList(Zip generic HList with static Nat HList)

我正在寻找一种方法将两个HList压缩在一起。 第一个是从以其通用表示转换的案例类生成的,第二个是手动定义为Nat的HList。

因此,我期望一个元组(或2个成员的HList)与case类中的一个字段,并且Nat关联。

目标是创建一个“可自定义的” 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] 。

I'm searching a way to zip two HList together. The first one is generated from a case class converted in its generic representation, and the second one is defined manually as an HList of Nat.

As a result, I expect a tuple (or 2-members HList) with one field from the case class, and the Nat associated.

The goal is to create a "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]

The result will have to match an encoderTuple[H, N <: Nat, T <: HList]: Encoder[(H, N) :: T] or and encoderHList[H, N <: Nat, T <: HList]: Encoder[(H::N::HNil) :: T].

最满意答案

目标是创建一个“可自定义的” 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)

The goal is to create a "customizable" ZipWithIndex.

I guess standard shapeless.ops.hlist.Zip should be enough for that:

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)

更多推荐

本文发布于:2023-08-04 07:26:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1412546.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:静态   Nat   HList   static   generic

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!