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!