Tipo de función inferida que comprime HLists

Gracias ahttps://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0 Entiendo cómo comprimir listas sin forma HLists:

Importar algunas cosas de Shapeless 2.0.0-M1:

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

Crea dos HLists:

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 ellos:

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

Ahora trata de definir una función que haga lo mismo:

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

El tipo de retorno inferido es Unidad, y de hecho, aplicar f a h1 y h2 hace exactamente eso:

scala> f(h1, h2)

scala> 

¿Hay una manera de definir f tal que obtenga ((5,6), (a, b)) de vuelta en este caso?

En última instancia, lo que estoy tratando de hacer es definir una función que comprima las dos listas de HL y luego las asigne, eligiendo _1 o _2 basado en el sorteo de una moneda, lo que produciría otra HL.

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

Que funciona bien en el REPL:

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

Pero me estoy volviendo loco en el problema anterior al intentar poner esto en una función.

¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta