Scala 在类中使用ReplaceAt
我正在为无形状的HList构建一个包装器,我想使用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
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