Abgeleiteter Funktionstyp, der HLists komprimiert

Dank anhttps://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0 Ich verstehe, wie man formlose HLists zip:

Importiere ein paar Sachen aus Shapeless 2.0.0-M1:

import shapeless._
import shapeless.ops.hlist._
import syntax.std.tuple._
import Zipper._

Erstellen Sie zwei HListen:

scala> val h1 = 5 :: "a" :: HNil
h1: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] = 5 :: a :: HNil

scala> val h2 = 6 :: "b" :: HNil
h2: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] = 6 :: b :: HNil

Zip sie:

scala> (h1, h2).zip
res52: ((Int, Int), (String, String)) = ((5,6),(a,b))

Versuchen Sie nun, eine Funktion zu definieren, die dasselbe tut:

scala> def f[HL <: HList](h1: HL, h2: HL) = (h1, h2).zip
f: [HL <: shapeless.HList](h1: HL, h2: HL)Unit

Der abgeleitete Rückgabetyp ist Unit, und tatsächlich bewirkt das Anwenden von f auf h1 und h2 genau das:

scala> f(h1, h2)

scala> 

Gibt es eine Möglichkeit, f so zu definieren, dass ich ((5,6), (a, b)) in diesem Fall zurückerhalte?

Letztendlich versuche ich, eine Funktion zu definieren, die die beiden HL-Listen zippt und sie dann abbildet. Dabei wähle ich entweder _1 oder _2 basierend auf einem Münzwurf, der einen weiteren HL ergeben würde.

object mix extends Poly1 {
  implicit def caseTuple[T] = at[(T, T)](t =>
    if (util.Random.nextBoolean) t._2 else t._1)
}

Was in der REPL gut funktioniert:

scala> (h1, h2).zip.map(mix)
res2: (Int, String) = (5,b)

Aber ich werde auf das oben genannte Problem aufmerksam, wenn ich versuche, es in eine Funktion umzusetzen.

Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage