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