Próbowałem zrobić kilka rzeczy zeszłej nocy wokół przyjęcia i wywołania funkcji ogólnej (tj. Typ jest znany w witrynie połączenia , ale potencjalnie różni się w różnych witrynach wywołań, więc definicja powinna być ogólna dla wszystkich arach).Scala Function.tupled i Function.untupled odpowiednik dla zmiennej arity, lub wywoływanie funkcji arith zmiennej z krotką
Załóżmy na przykład, że mam funkcję f: (A, B, C, ...) => Z
. (W rzeczywistości istnieje wiele takich f
s, których nie znam z góry, a więc nie mogę naprawić typów ani liczby A, B, C, ..., Z
.)
Próbuję osiągnąć następujące.
Jak mogę zadzwonić
f
rodzajowo z instancją(A, B, C, ...)
? Jeśli podpisf
był znany z góry, mógłbym zrobić coś z udziałemFunction.tupled f
lub odpowiednika.Jak zdefiniować inną funkcję lub metodę (na przykład, pewną metodę
apply
) z tym samym podpisem cof
? To znaczy, jak zdefiniować typg
, dla którego sprawdzany jest typg(a, b, c, ...)
tylko wtedy, gdy sprawdzany jest typ? Szukałem tego w Shapeless'sHList
. Z tego, co mogę do tej pory stwierdzić,HList
rozwiązuje przynajmniej kwestię "reprezentowania arbitralnej listy argumentów arity", a także, że Shapeless rozwiąże konwersję do i z kwestii krotki. Jednak nadal nie jestem pewien, czy rozumiem, jak to by pasowało do funkcji ogólnej arii, jeśli w ogóle.Jak zdefiniować inną funkcję lub metodę z odpowiednim podpisem typu na
f
? Największy przykład, który przychodzi mi na myśl, to okołoh: (A, B, C, ...) => SomeErrorThing[Z] \/ Z
.
Pamiętam, jak jakiś czas temu oglądałem prezentację konferencji na temat Shapeless. Podczas gdy prezenter nie wykazał tego wyraźnie, to co oni pokazali (różne techniki dotyczące abstrakcji/generalizacji krotek w stosunku do HList
s) mogłoby doprowadzić mnie do przekonania, że podobne rzeczy jak powyższe są możliwe przy użyciu tych samych narzędzi.
Z góry dziękuję!
Jestem przekonany, że Shapeless pomoże ci to zrobić. Niestety nie mam teraz czasu, żeby się z tym bawić. – gzm0
Mam wrażenie, że podobnie jak to, co widziałem, robi to Shapeless, ale nie jestem pewien jak. – Ming