我已经在HList上创建了一个包装器,它可以附加一个HLists。它的定义如下:
class HListWrapper[L <: HList](val hl: L) {
def append[V, Out <: HList](k: Witness, v: V)(implicit updater: Updater.Aux[L, FieldType[k.T, V], Out],
lk: LacksKey[L, k.T]): HListWrapper[Out] = {
new HListWrapper(updater(hl, field[k.T](v)))
}
}
object HListWrapper {
def apply[P <: Product, L <: HList](p: P)(implicit gen: LabelledGeneric.Aux[P, L]) =
new HListWrapper(gen.to(p))
}它是这样用的:
case class CC(i: Int, ii: Int)
val cc = CC(100, 1000)
val hl = HListWrapper(cc)
hl.append('iii, 10000)但是,当我试图将HListWrapper放入另一个函数以捕获Out类型时,编译器似乎无法解析转换的最终类型(类型错配错误失败):
def cctohlist[Out <: HList]: CC => HListWrapper[Out] = {
m => {
val hl = HListWrapper(m)
hl.append('iii, 10000)
}
}创建cctohlist方法的主要原因是在追加后获取HList的类型。这是可能的吗?
发布于 2017-11-02 08:57:23
以下代码起作用:
def cctohlist: CC => HListWrapper[Record.`'i -> Int, 'ii -> Int, 'iii -> Int`.T] = {
m => {
val hl = HListWrapper(m)
hl.append('iii, 10000)
}
}当你写
def cctohlist[Out <: HList]: CC => HListWrapper[Out] = ???这意味着我可以应用cctohlist[Int :: String :: Boolean :: HNil]并拥有CC => HListWrapper[Int :: String :: Boolean :: HNil],或者我可以应用cctohlist[AnyVal :: AnyRef :: Any :: HNil]和CC => HListWrapper[AnyVal :: AnyRef :: Any :: HNil]等等。
这是一种通用的方法:
def cctohlist[P <: Product, L <: HList, Out <: HList](m: P)(implicit
gen: LabelledGeneric.Aux[P, L],
updater: Updater.Aux[L, FieldType[Witness.`'iii`.T, Int], Out],
lk: LacksKey[L, Witness.`'iii`.T]
): HListWrapper[Out] = {
val hl = HListWrapper(m)
hl.append('iii, 10000)
}
cctohlist(cc)https://stackoverflow.com/questions/47066012
复制相似问题