我想将某些案例类转换为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,则没有错误,但是我需要保存索引。 有可能实现吗?
答案 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)
}
}