Я пытался сделать что-то вчера вечером, приняв и назвав общую функцию (т.е. тип известен на сайте вызова, но потенциально может варьироваться в разных сайтах, поэтому определение должно быть общим по всем направлениям).
Например, предположим, что у меня есть функция f: (A, B, C, ...) => Z
. (На самом деле существует много таких f
s, о которых я не знаю заранее, поэтому я не могу исправить типы и количество A, B, C, ..., Z
.)
Я пытаюсь добиться следующего.
-
Как мне вызвать
f
в общем случае с экземпляром(A, B, C, ...)
? Если подписьf
была известна заранее, я мог бы сделать что-то, включающееFunction.tupled f
или эквивалентный. -
Как определить другую функцию или метод (например, метод
object
apply
) с той же подписью, что иf
? То есть, как я могу определитьg
, для которого типg(a, b, c, ...)
проверяет, следует ли и только если тип t212 > проверяет тип? Для этого я искал ShapelessHList
. Из того, что я могу сказать до сих пор,HList
, по крайней мере, решает проблему "представления произвольного аргумента arties", а также Shapeless решит преобразование в и из кортежа. Тем не менее, я все еще не уверен, что понимаю, как это будет вписываться в функцию общей арности, если это вообще возможно. -
Как определить другую функцию или метод с соответствующей сигнатурой типа в
f
? Самый большой пример, который приходит сейчас на ум, - это немногоh: (A, B, C, ...) => SomeErrorThing[Z] \/ Z
.
Я помню, как некоторое время назад я смотрел презентацию конференции о Shapeless. Пока ведущий явно не продемонстрировал эти вещи, то, что они продемонстрировали (различные методы, связанные с абстрагированием/обобщением кортежей vs HList
s), побудило бы меня поверить, что подобные вещи, как указано выше, возможны с помощью тех же инструментов.
Спасибо заранее!