Sto essenzialmente cercando l'opposto della classe di tipo Prepend[A, B]
.Divisione di una lista H concatenata utilizzando Prepend [A, B]
Se ho qualcosa di simile:
type A = String :: Int :: HNil
type B = Boolean :: Double :: HNil
val a: A = "a" :: 1 :: HNil
val b: B = false :: 2.1 :: HNil
scala> val ab = a ++ b
ab: shapeless.::[String,shapeless.::[Int,shapeless.::[Boolean,shapeless.::[Double,shapeless.HNil]]]] = a :: 1 :: false :: 2.1 :: HNil
ho un HList
a
di tipo A
ed un HList
b
di tipo B
, posso trovare un prepend: Prepend[A, B]
tale che io possa concatenare con a ++ b
.
Ma se ho un HList
ab
di tipo prepend.Out
, come posso estrarre l'originale A
e B
? Non riesco a trovare una classe di tipo che faccia il lavoro, e forse non ce n'è uno. Sembra che avrei bisogno di qualcosa come trait Cut[A <: HList, B <: HList, c <: HList]
che testimonia che C
è stato creato pre-pending A
a B
, anche se non sono sicuro di come andrei a generare testimoni.
Molto approssimativamente come:
def Cut[A <: HList, B <: HList, C <: HList](c: C)(implicit cut: Cut[A, B, C]): (A, B) = ???
puoi prendere in considerazione [tagging] (http://eed3si9n.com/learning-scalaz/Tagged+type.html) (avviso: i tipi con tag di scalaz non sono così cool come lo erano) di ogni elemento con qualche tipo unico (generalo come path-dependent), come 'val a: A =" a ":: 1 :: HNil taggato; val a: B = "a" :: 1 :: HNil tagged' e quindi basta filtrare ogni lista per tipo. solo un'idea - non ho controllato :) – dk14