Zasadniczo szukam przeciwieństwa do klasy typu Prepend[A, B]
.Dzielenie listy HList połączonej za pomocą polecenia Przygotuj [A, B]
Jeśli mam coś takiego:
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
Mam HList
a
typu A
i HList
b
typu B
mogę znaleźć prepend: Prepend[A, B]
takie, że mogę łączyć je z a ++ b
.
Ale jeśli mam HList
ab
typu prepend.Out
, w jaki sposób można wyodrębnić oryginalne A
i B
? Nie mogę znaleźć klasy, która wykonuje tę pracę i być może nie ma takiej. Wygląda na to, że potrzebowałbym czegoś takiego, jak trait Cut[A <: HList, B <: HList, c <: HList]
, który był świadkiem, że C
został utworzony przez oczekujące A
na B
, chociaż nie jestem pewien, w jaki sposób chciałbym wygenerować świadków.
grubsza tak:
def Cut[A <: HList, B <: HList, C <: HList](c: C)(implicit cut: Cut[A, B, C]): (A, B) = ???
możesz rozważyć [tagowanie] (http://eed3si9n.com/learning-scalaz/Tagged+type.html) (ostrzeżenie: typy oznaczone skalą nie są tak fajne, jak były) każdego elementu z unikalnym typem (generuj go jako zależny od ścieżki), jak znacznik 'val a: A =" a ":: 1 :: HNil; val a: B = "a" :: 1 :: HNil tagged', a następnie po prostu filtruj każdą listę według typu. tylko pomysł - nie sprawdziłem :) – dk14