2015-10-15 97 views
3

在下面的例子中,我得到找不到隱含的參數拉鍊值:shapeless.ops.hlist.Zip [shapeless。:: [keys.Out,shapeless。:: [mapper.Out, shapeless.HNil]]]斯卡拉形狀不拉鍊問題

我認爲我需要另一個隱式,但不能算出語法。想法?

def mapCCLV[P <: Product, K <: HList, L <: HList, M <: HList](p: P)(poly: Poly1)(
    implicit gen: Generic.Aux[P, L], lab: LabelledGeneric.Aux[P, K], 
    keys: Keys[K], mapper: Mapper.Aux[poly.type, L, M]) = { 
    val k = keys.apply 
    val v = gen.to(p).map(poly) 
    k.zip(v) 
} 

回答

4

像錯誤消息說,你需要一個Zip類型的類實例的額外的隱含參數,才能夠壓縮。

import shapeless._, shapeless.ops.hlist._, record._, ops.record._, labelled._ 

def mapCCLV[P <: Product, LG <: HList, K <: HList, G <: HList, M <: HList](
    p: P)(poly: Poly1 
)(implicit 
    gen: Generic.Aux[P, G], 
    lab: LabelledGeneric.Aux[P, LG], 
    keys: Keys.Aux[LG, K], 
    mapper: Mapper.Aux[poly.type, G, M], 
    zip: Zip[K :: M :: HNil] 
): zip.Out = { 
    val k = keys() 
    val v = gen.to(p).map(poly) 
    k.zip(v) 
} 

更可能要使用ZipWithKeys而不是Zip

def mapCCLV[P <: Product, LG <: HList, K <: HList, G <: HList, M <: HList, Out <: HList](
    p: P)(poly: Poly1 
)(implicit 
    gen: Generic.Aux[P, G], 
    lab: LabelledGeneric.Aux[P, LG], 
    keys: Keys.Aux[LG, K], 
    mapper: Mapper.Aux[poly.type, G, M], 
    zwk: ZipWithKeys.Aux[K, M, Out] 
) = gen.to(p).map(poly).zipWithKeys(keys()) 
+0

第一個例子有效。不過,我認爲第二件事情並不完全正確 - 它只是返回沒有鍵的映射的HList。我已經嘗試了幾個按鍵/ zwk等排列組合運氣不錯。 – satyagraha

+0

您使用與'LG'相同的密鑰獲得記錄。你可以在結果的類型中看到'with shapeless.labelled.KeyTag ...'。 –