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 .

  • java.lang.NoClassDefFoundError $$ inlined $ forEach $ lambda $ 1 en Kotlin
  • ¿Utilizas return dentro de una lambda?
  • ¿Cómo pasar arguments a la function lambda anónima en Kotlin?
  • Kotlin: ¿Cómo puedo invocar un campo lambda que tiene un tipo genérico de su class?
  • Inicializador de propiedad de múltiples líneas / complejo sin lambda
  • Variable de lanzamiento inteligente en la solución de lambda kotlin
  • Usar interfaces funcionales con types de funciones en Kotlin
  • Enlace de datos: el campo Observable con valor lambda no comstack
  • Kotlin - Lista dentro de un filter de list
  • Kotlin: cuándo y cómo se deben usar las expresiones Lambda
  • Kotlin no puede acceder a kotlin.jvm.functions.Function1 cuando llama a la function kotlin con java lambda