首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用静态Nat HList压缩通用HList

用静态Nat HList压缩通用HList
EN

Stack Overflow用户
提问于 2017-08-01 20:52:22
回答 1查看 106关注 0票数 3

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

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

目标是创建一个“可定制的”ZipWithIndex

代码语言:javascript
复制
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]匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-28 08:35:47

目标是创建一个“可定制的”ZipWithIndex

我想标准的shapeless.ops.hlist.Zip应该就足够了:

代码语言:javascript
复制
  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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45447517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档