Scala 在类中使用ReplaceAt

Scala 在类中使用ReplaceAt,scala,generics,shapeless,Scala,Generics,Shapeless,我正在为无形状的HList构建一个包装器,我想使用updatedAt函数来更新HList中的一个值,但我似乎无法获得正确的结果。我认为这两个版本最接近于有效的解决方案: class Data[L <: HList](val hl: L) { def updatedAtV1[V](n : Nat, value : V)(implicit replacer : ReplaceAt[L, n.N, V]) : replacer.Out = replacer(hl, va

我正在为无形状的HList构建一个包装器,我想使用
updatedAt
函数来更新HList中的一个值,但我似乎无法获得正确的结果。我认为这两个版本最接近于有效的解决方案:

class Data[L <: HList](val hl: L) {

  def updatedAtV1[V](n : Nat, value : V)(implicit 
         replacer : ReplaceAt[L, n.N, V]) : replacer.Out = replacer(hl, value)

  def updatedAtV2[V, Out <: HList](n : Nat, value : V)(implicit
         replacer : ReplaceAt.Aux[L, n.N, V, (V, Out)]) : Out = replacer(hl, value)._2

}

类数据[L它不适用于不同的类型,因为这隐含:

ReplaceAt.Aux[L, n.N, V, (V, Out)] 
您告诉我您想在
n
处放置一个
V
类型的值,然后将
V
从列表中取出。您可以通过引入额外的类型参数来修复它:

def updatedAtV3[V, W, Out <: HList](n : Nat, value : V)(implicit
  replacer : ReplaceAt.Aux[L, n.N, V, (W, Out)]) : Out = replacer(hl, value)._2

谢谢。我完全错过了那一点。
new Data(1 :: HNil).updatedAtV3(0, 42) == 42 :: HNil    
new Data(1 :: HNil).updatedAtV3(0, "foo") == "foo" :: HNil