Tipo Lambda con número variable de args en Kotlin?

¿Es posible recibir como un parámetro lambda en línea un tipo de function que tiene un retorno garantizado tipo R pero un número variable de arguments ? Para simplificar, considere lo siguiente:

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

Supongamos que tengo otras funciones en línea que también toman los parameters lambda que pueden ser del tipo (A)->R o (A,B)->R o (A,B,C)->R , cuyos parameters me gustaría para pasar a esta function Todos ellos proporcionarán una R pero todos deben invocarse para get la R , sin conocer el número / tipo / valores de los parameters en esta function. ¿Hay alguna manera de modificar genéricamente la function anterior para:

  1. capturar el caso genérico de cualquier parámetro lambda que devuelva R para sus inputs
  2. evitar cualquier cambio en las otras funciones en línea que llamarán a esta function
  3. mantener las eficiencias en línea

Esto es imposible

Kotlin utiliza tipeo estático y fuerte, y el comstackdor necesita saber el tipo exacto de los parameters lambda en time de compilation. Internamente, las lambdas son en realidad implementaciones de una de las interfaces kotlin.jvm.functions (para JVM o Android), como esta:

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

Estas interfaces definen la cantidad exacta de parameters y sus types. Debido a eso, no es posible crear un vararg lambda en Kotlin. Esto, por supuesto, está relacionado con el hecho de que vararg en JVM es solo un vararg de syntax que internamente utiliza matrices ordinarias, pero no es un tipo de construcción de sistema por sí mismo, por lo que no se pueden tratar types similares a vararg .

Tipos dependientes

Una sugerencia para resolver su problema es utilizar una Array o una Collection como parámetro de function, o pasar en Function<R> arbitraria, pero esta solución está limitada en la forma en que no hay forma de aplicar estáticamente la misma cantidad de la parameters de cada function pasada, porque el sistema de tipo en sí no conoce el tamaño de la colección / matriz o el conteo de parameters de la Function<R> .

Para resolver completamente su problema, necesita un lenguaje con sistema de tipo dependiente .

  • Kotlin: uso ilegal de devolución de parameters en línea
  • Funciones de Lambda con comodines en Kotlin
  • Pase la interfaz como parámetro en Kotlin
  • ¿Por qué la variable no se puede inicializar correctamente en la function en línea como en Java?
  • Kotlin - Cómo recursivamente llamar a una function lambda
  • Configuración de oyentes de Android en Kotlin: uso del retorno en lambdas
  • Expresiones de kotlin lambda como parámetro opcional
  • La function de extensión de kotlin no entiende cómo funciona esto
  • Kotlin genera class interna para lambda
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • Kotlin, Proguard y lambdas