updatedAt 函数更新HList中的值,但我似乎无法正确获取隐式。以下是我认为最接近有效解决方案的两个版本:
updatedAt
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 }
V1 编译,但因为它返回 Tuple 元组 键入以便我无法获取 replacer(hl, value)._2 V2 编译器无法解析 Out 类型
V1
Tuple
元组
replacer(hl, value)._2
V2
Out
请注意 V2 如果值的类型与其替换的类型相同,则可以正常工作,但如果值的类型不同,则会失败。
由于此隐式,它不适用于不同的类型:
ReplaceAt.Aux[L, n.N, V, (V, Out)]
您要放置类型为的值 V n ,并获取 五、
V
n
五、
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
那里 W -列表中已有的元素-可以是任何元素(将从隐式参数中推断),因此一切都正常:
W
new Data(1 :: HNil).updatedAtV3(0, 42) == 42 :: HNil new Data(1 :: HNil).updatedAtV3(0, "foo") == "foo" :: HNil