使用静态Nat HList压缩通用HList

时间:2017-08-01 20:52:22

标签: scala typeclass shapeless

我正在寻找将两个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]匹配。

1 个答案:

答案 0 :(得分:1)

  

目标是创建“可自定义的”function ReadStream(fd, options) { if (!(this instanceof ReadStream)) return new ReadStream(fd, options); if (fd >> 0 !== fd || fd < 0) throw new errors.RangeError('ERR_INVALID_FD', fd); options = util._extend({ highWaterMark: 0, readable: true, writable: false, handle: new TTY(fd, true) }, options); net.Socket.call(this, options); this.isRaw = false; this.isTTY = true; }

我认为标准的shapeless.ops.hlist.Zip应该足够了:

ZipWithIndex