Это вполне возможно на статически типизированном языке.Вся эта штука об этом.Конечно, использование отражения дает вам такую же безопасность типов, как и в Lisp.С другой стороны, хотя я не знаю, существуют ли статически типизированные языки, поддерживающие такую функцию, мне кажется, что это можно сделать.
Позвольте мне показать, как, по моему мнению, Scala может быть расширена для поддержки этой функции.Во-первых, давайте рассмотрим более простой пример:
def apply[T, R](f: (T*) => R)(args: T*) = f(args: _*)
Это настоящий код Scala, и он работает, но он не будет работать для любой функции, которая получает произвольные типы.Во-первых, нотация T*
вернет Seq[T]
, который представляет собой последовательность гомогенизированного типа.Тем не менее, существуют гетерогенно типизированные последовательности, такие как HList .
Итак, во-первых, давайте попробуем использовать HList
здесь:
def apply[T <: HList, R](f: (T) => R)(args: T) = f(args)
Это все еще работает Scala, но мы накладываем большое ограничение на f
, говоря, что он должен получить HList
вместо произвольного количества параметров.Допустим, мы используем @
для преобразования разнородных параметров в HList
, аналогично *
преобразует из однородных параметров в Seq
:
def apply[T, R](f: (T@) => R)(args: T@) = f(args: _@)
Мы не говорим о реальныхжизнь Скала больше, но гипотетическое улучшение к нему.Это выглядит разумно для меня, за исключением того, что T
должен быть один тип по обозначению параметра типа.Возможно, мы могли бы просто расширить его таким же образом:
def apply[T@, R](f: (T@) => R)(args: T@) = f(args: _@)
Мне кажется, это могло бы сработать, хотя это может быть наивностью с моей стороны.
Давайте рассмотрим альтернативурешение, одно в зависимости от унификации списков параметров и кортежей.Допустим, в Scala наконец-то появился унифицированный список параметров и кортежей, и что все кортежи были подклассом абстрактного класса Tuple
.Тогда мы могли бы написать это:
def apply[T <: Tuple, R](f: (T) => R)(args: T) = f(args)
Там.Создание абстрактного класса Tuple
было бы тривиальным, и объединение списка кортежей / параметров не является надуманной идеей.