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