2017-11-02 14 views
0

を追加できるHListの上にラッパーを作成しました。次のように定義されますHList変換アウトタイプ

class HListWrapper[L <: HList](val hl: L) { 
    def append[V, Out <: HList](k: Witness, v: V)(implicit updater: Updater.Aux[L, FieldType[k.T, V], Out], 
               lk: LacksKey[L, k.T]): HListWrapper[Out] = { 
    new HListWrapper(updater(hl, field[k.T](v))) 
    } 
} 
object HListWrapper { 
    def apply[P <: Product, L <: HList](p: P)(implicit gen: LabelledGeneric.Aux[P, L]) = 
    new HListWrapper(gen.to(p)) 
} 

それはこのように使用:

case class CC(i: Int, ii: Int) 
val cc = CC(100, 1000) 
val hl = HListWrapper(cc) 
hl.append('iii, 10000) 

しかし、私はOutの種類をキャプチャするために、別の関数内HListWrapperを置くしようとすると、コンパイラは解決に見えることはできません変換の最終的なタイプ(型の不一致エラーで失敗):

def cctohlist[Out <: HList]: CC => HListWrapper[Out] = { 
    m => { 
    val hl = HListWrapper(m) 
    hl.append('iii, 10000) 
    } 
} 

cctohlistメソッドを作成する主な理由は、Geでありますt追加後のHListのタイプ。達成することは可能ですか?

答えて

1

次のコードは動作します:あなたは、これは私がcctohlist[Int :: String :: Boolean :: HNil]を適用し、CC => HListWrapper[Int :: String :: Boolean :: HNil]を持っているか、私はcctohlist[AnyVal :: AnyRef :: Any :: HNil]を適用し、これは明らかにされていないCC => HListWrapper[AnyVal :: AnyRef :: Any :: HNil]などを持つことができることを意味し

def cctohlist[Out <: HList]: CC => HListWrapper[Out] = ??? 

書く

def cctohlist: CC => HListWrapper[Record.`'i -> Int, 'ii -> Int, 'iii -> Int`.T] = { 
    m => { 
     val hl = HListWrapper(m) 
     hl.append('iii, 10000) 
    } 
    } 

場合。


これは一般的なものである:更新のための

def cctohlist[P <: Product, L <: HList, Out <: HList](m: P)(implicit 
    gen: LabelledGeneric.Aux[P, L], 
    updater: Updater.Aux[L, FieldType[Witness.`'iii`.T, Int], Out], 
    lk: LacksKey[L, Witness.`'iii`.T] 
): HListWrapper[Out] = { 
    val hl = HListWrapper(m) 
    hl.append('iii, 10000) 
    } 

cctohlist(cc) 
+0

感謝。追加した後に 'HList'の型を取得するために' cctolist'をリファクタリングする他の方法はありますか? – jamborta

+0

@jamborta答えを更新しました。 –

関連する問題