2017-08-01 1 views
3

Ich suche eine Möglichkeit, zwei HList zusammen zip. Der erste wird aus einer Fallklasse generiert, die in seiner generischen Darstellung konvertiert wird, und der zweite wird manuell als ein HList von Nat definiert.Zip generische HList mit statischen Nat HList

Als Ergebnis erwarte ich ein Tupel (oder 2-Mitglieder-HList) mit einem Feld aus der Fallklasse und die Nat zugeordnet.

Das Ziel ist es, eine "anpassbare" ZipWithIndex zu erstellen.

def derive[A, I <: HList, R <: HList, Z <: HList](implicit 
    gen: Generic.Aux[A, R], 
    zipper: Zip.Aux[R, I, Z], 
    enc: Lazy[Encoder[Z]])(a: A): Deriver[A] = { 
    val genRepr = gen.to(A) 
    val zipped = zip(genRepr :: ??? :: HNil) 
    enc.value(zipped) 
} 

case class Foo(a: String, b: String, c: String) 
derive[Foo, Nat._1 :: Nat._3 :: Nat.7 :: HNil] 

Das Ergebnis wird eine encoderTuple[H, N <: Nat, T <: HList]: Encoder[(H, N) :: T] oder und encoderHList[H, N <: Nat, T <: HList]: Encoder[(H::N::HNil) :: T] übereinstimmen müssen.

+0

Lieber @JulienLafont, es ist eine Weile her, seit Sie Ihre Frage gefragt, ob Sie einen Moment Zeit haben können Sie überprüfen, Wenn meine [Antwort] (https://Stackoverflow.com/a/45914883/5249621) in Ordnung ist? Vielen Dank. –

Antwort

1

Das Ziel ist es, eine "anpassbare" ZipWithIndex zu erstellen.

Ich denke, Standard shapeless.ops.hlist.Zip für das genug sein sollte:

trait Encoder[Z] { 
    type Out 
    def apply(z: Z): Out 
    } 

    object Encoder { 
    type Aux[Z, Out0] = Encoder[Z] { type Out = Out0 } 

    // implicits 
    } 

    trait Deriver[A] 

    object Deriver { 
    // implicits 
    } 

    def derive[A, I <: HList, R <: HList, Z <: HList](a: A, i: I)(implicit 
                gen: Generic.Aux[A, R], 
                zipper: Zip.Aux[R :: I :: HNil, Z], 
                enc: Lazy[Encoder.Aux[Z, Deriver[A]]]): Deriver[A] = { 
    val genRepr: R = gen.to(a) 
    val zipped: Z = zipper(genRepr :: i :: HNil) 
    enc.value(zipped) 
    } 

    case class Foo(a: String, b: String, c: String) 
// derive[Foo, Nat._1 :: Nat._3 :: Nat._7 :: HNil, ???, ???] 
    derive(Foo("aaa", "bbb", "ccc"), Nat._1 :: Nat._3 :: Nat._7 :: HNil) 
Verwandte Themen