Лямбда-тип с переменным числом аргументов в Котлине?

Можно ли получить в качестве встроенного параметра лямбда тип функции, который имеет гарантированный тип возврата R но переменное количество аргументов ? Для простоты рассмотрим следующее:

 inline fun <R> Boolean?.tfn(tru:()->R, fls:()->R, nul:()->R) = if (this == null) nul() else if (this) tru() else fls() 

Предположим, что у меня есть другие встроенные функции, которые также принимают параметры лямбда, которые могут иметь тип (A)->R или (A,B)->R или (A,B,C)->R , параметры которого я бы хотел перейти к этой функции. Все они будут предоставлять R но все они должны быть вызваны, чтобы получить R , не зная значения / тип / значения параметров в этой функции. Есть ли способ для общего изменения функции выше:

  1. захватить общий случай любого лямбда-параметра, возвращающего R для его входов
  2. избегать любых изменений в других встроенных функциях, которые будут вызывать эту функцию
  3. поддерживать встроенную эффективность

Это невозможно

Kotlin использует статический, сильный набор, и компилятор должен знать точный тип параметров лямбда во время компиляции. Внутренние лямбды – это фактически реализация одного из интерфейсов kotlin.jvm.functions (для JVM или Android), как этот:

 /* A function that takes 1 argument. */ public interface Function1<in P1, out R> 

Эти интерфейсы определяют точное количество параметров и их типы. Из-за этого в Котлине невозможно создать vararg лямбда. Это, конечно, связано с тем, что vararg в JVM является просто синтаксическим сахаром, который внутренне использует обычные массивы, но сам по себе не является конструкцией системы типов, поэтому вы не можете обрабатывать подобные типы vararg .

Зависимые типы

Одним из предложений по решению вашей проблемы является использование Array или Collection в качестве параметра функции или передача произвольной Function<R> , но это решение ограничено тем, что нет возможности для статического применения такой же суммы параметры каждой переданной функции, потому что сама система типов не знает о размере сбора / массива или числа параметров Function<R> .

Чтобы полностью решить вашу проблему, вам нужен язык с зависимой системой типов .