Kotlin – Cómo recursivamente llamar a una function lambda
Estoy tratando de volver a implementar la function de linrec desde aquí en Kotlin. Esto es lo que actualmente se ve en Kotlin:
fun <A, B> linrec(indivisible: (List<A>) -> Boolean, value: (List<A>) -> B, divide: (List<A>) -> List<List<A>>, combine: (A, B) -> B ) : (List<A>) -> B { val myfunc: (List<A>) -> B = { input -> if (indivisible(input)) { value(input) } else { val split = divide(input) val left = split[0][0] val right = myfunc(split[1]) // Error combine(left, right) } } return myfunc }
IntelliJ me da los siguientes errores cuando bash ejecutar el código:
- Kotlin: recursión de queue para funciones mutuamente recursivas
- Cómo implementar dropWhile recursivamente con foldRight en Kotlin
- ¿Cómo iterar a través de los attributes de un JsonObject recursivamente?
Error:(40, 19) Kotlin: Unresolved reference: myfunc
Mi pregunta es: ¿cómo hago que una function lambda se llame sola?
No llamas a una lambda ("function anónima") desde dentro de sí misma. Para eso son las funciones:
fun <A, B> linrec(indivisible: (List<A>) -> Boolean, value: (List<A>) -> B, divide: (List<A>) -> List<List<A>>, combine: (A, A) -> B ) : (List<A>) -> B { fun myfunc(input: List<A>): B { // rearranged things here return if (indivisible(input)) { // added `return` value(input) } else { val split = divide(input) val left = split[0][0] val right = myfunc(split[1]) combine(left, right) // * } } return ::myfunc }
Ahora bien, este es exactamente el código que ha escrito, pero no comstack. En la línea que marqué con *
kotlinc dice Type mismatch: infernetworking type is B but A was expected
PD. No tengo idea de lo que está haciendo ese código, así que solo solucioné el error de compilation que me has preguntado.