如何在zipWithIndex之后映射无形的HList?

时间:2018-11-04 17:52:00

标签: scala shapeless

我想将某些案例类转换为HList,然后使用返回的HList索引进行压缩,然后使用索引进行映射:

class B[A]() {    
  def foo[H <: HList](tuple: A)(implicit gen: Generic.Aux[A, H],
                                               zip: ZipWithIndex[H],
                                               mapper: Mapper[UpdateOps.type, ZipWithIndex[H]#Out]) = {
    gen.to(tuple).zipWithIndex.map(UpdateOps)
  }
}

UpdateOps是一个包对象:

 object UpdateOps extends Poly1 {
    ??? // not implemented yet
  }

问题是我遇到了编译错误:

  

错误:(24,35)找不到参数映射器的隐式值:   shapeless.ops.hlist.Mapper [UpdateOps.type,zip.Out]       gen.to(tuple).zipWithIndex.map(UpdateOps)错误:(24,35)没有足够的参数用于方法映射:(隐式映射器:   shapeless.ops.hlist.Mapper [UpdateOps.type,zip.Out])mapper.Out。   未指定的值参数映射器。       gen.to(tuple).zipWithIndex.map(UpdateOps)

如果我仅映射HList,则没有错误,但是我需要保存索引。 有可能实现吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Aux模式将隐式解析类型的输出类型用作下一个隐式类型的输入类型:

class B[A]() {
  def foo[
  H <: HList,
  Z <: HList,
  O <: HList](tuple: A)
             (implicit gen: Generic.Aux[A, H],
              zip: ZipWithIndex.Aux[H, Z],
              mapper: Mapper.Aux[UpdateOps.type, Z, O]): O = {
    gen.to(tuple).zipWithIndex.map(UpdateOps)
  }
}