Próbuję sparametryzować metodę, która musi działać na typ ogólny A
, dla której można pobrać LabelledGeneric
. Oto naiwna metoda:Przekaż parametr typu, który ma być użyty jako argument EtykietyGeneric
Oczywiście, podstawowe makro narzeka. Nie wie wystarczająco dużo o A
:
typ A nie jest klasą lub cecha
Więc starałem się mieć LabelledGeneric
wywnioskować
def params[A](a: A)(implicit lbl: LabelledGeneric[A]) = {
val keys = Keys[lbl.Repr].apply
...
}
wydaje do pracy, ale typ Repr
nie jest już znany jako HList
typu argumenty [lbl.Repr] nie odpowiadają metody zastosować typ granic parametrów [L <: shapeless.HList]
Ok, spróbujmy dokładniej
def params[A, Repr <: HList](a: A)(implicit lbl: LabelledGeneric.Aux[A, Repr]) = {
val keys = Keys[lbl.Repr].apply
...
}
teraz Repr
jest zdecydowanie HList
, ale nadal nie można rozwiązać Keys
jego implicits
nie mógł znaleźć ukrytą wartość dla wartości parametrów: shapeless.ops.record.Values [lbl.Repr]
ostatniej próby, spróbujmy się mieć wszystko, czego potrzebuję obliczane w sposób dorozumiany
def params[A, Repr <: HList](a: A)(implicit
lbl: LabelledGeneric.Aux[A, Repr],
kk: Keys[Repr]
) = {
val keys = kk.apply
...
}
Wciąż nie ma szczęścia, pozornie pierwszy niejawna nie mogą być rozwiązane w miejscu połączenia
nie mógł odnaleźć ukrytą wartość parametru LBL: shapeless.LabelledGeneric.Aux [example.Main.Foo.type, Repr]
[Błąd] params (Foo)
Oczywiście to wszystko maszynowych prac, kiedy zajmujących się bezpośrednio z określonym typem, np
val lbl = LabelledGeneric[Foo]
val keys = Keys[lbl.Repr].apply
// no problem
ja wyraźnie brakuje potrzebnej zestaw udoskonaleń w moim typu w podpis metody, ale mogę uzyskać moja głowa wokół tego, co się tutaj dzieje. Dowolny pomysł?
Czy możesz oznaczyć to za pomocą używanego języka? –
@ 500-InternalServerError oczywiście, mój zły. Zrobione –
@GabrielePetronella miło wyjaśnić, jestem trochę zawiedziony, że znajdę ten wpis SO po przejściu przez pół dnia, aby znaleźć to, co już wyjaśniłeś – crak