代码之家  ›  专栏  ›  技术社区  ›  jamborta

在类内使用ReplaceAt

  •  1
  • jamborta  · 技术社区  · 8 年前

    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
    
    }
    

    V1 编译,但因为它返回 Tuple 元组 键入以便我无法获取 replacer(hl, value)._2 V2 编译器无法解析 Out 类型

    请注意 V2 如果值的类型与其替换的类型相同,则可以正常工作,但如果值的类型不同,则会失败。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Oleg Pyzhcov    8 年前

    由于此隐式,它不适用于不同的类型:

    ReplaceAt.Aux[L, n.N, V, (V, Out)] 
    

    您要放置类型为的值 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 -列表中已有的元素-可以是任何元素(将从隐式参数中推断),因此一切都正常:

    new Data(1 :: HNil).updatedAtV3(0, 42) == 42 :: HNil    
    new Data(1 :: HNil).updatedAtV3(0, "foo") == "foo" :: HNil