2017-09-27 7 views
1

Shapeless HListのラッパーを構築していますが、updatedAt関数を使用してHListの値を更新したいと思いますが、暗黙のうちに正しい値を取得できないようです。クラス内でReplaceAtを使用する

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要素を取得することはできませんのでTuple型にそれを強制することができません:これらは私が考える2つのバージョンが作業溶液に最も近いです。 V2では、コンパイラはOut型を解決できません。

V2は、値が同じタイプのタイプであればOKですが、タイプが異なる場合は失敗します。

答えて

2

それが原因でこの暗黙の異なるタイプでは動作しません:

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

あなたがnでタイプVの値を配置し、バックHListのうち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 

W

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

あなたは余分なタイプのパラメータを導入することにより、それを修正することができますありがとうございました。私は完全にそのビットを逃した。 – jamborta

関連する問題