Funciones de Orden Superior

Explicación del concepto de funciones de orden superior y su aplicación.

CONCEPTO

Fuente: develou

Una función de orden superior, es una función que puede recibir como argumento una o más funciones y/o retornar una función como resultado.

Esto es posible ya que el lenguaje de programación Kotlin incluye en su gramática tipos de datos función.

Indirectamente se utilizan mucho ya que las funciones de orden superior son el origen de las funciones lambda que veremos en el siguiente tema.

IMPLEMENTACIÓN

Sintaxis

La sintaxis de una función de orden superior sigue la siguiente sintaxis:

fun(arg1: T, arg2: T, argfun: (Targ1, Targ2) -> Treturn): T

Explicación de código

En el ejemplo anterior tenemos una función con dos argumentos normales pero el tercer argumento es una función.

El argumento función se declara con los tipos de sus argumentos entre paréntesis, una flecha y el tipo del return.

Es indispensable hacer referencia al tipo del return del argumento función. Si no es un tipo explícito, utilizamos el tipo Unit.

Por último, como todas las funciones, el tipo del return de la función como tal.

Ejemplo

fun calculadora(x: Int, y: Int, fn: (Int, Int) -> Int): Int {
    return fn(x, y)
}

fun suma(x: Int, y: Int) = x + y
fun resta(x: Int, y: Int) = x - y
fun mult(x: Int, y: Int) = x * y
fun divis(x: Int, y: Int) = x / y

Como puede ver, la función calculadora() recibe dos Int y una función y despues aplica dicha función sobre ambos Int.

Las cuatro funciones de las operaciones (suma, resta, mult y divis), son válidas para ser pasadas como argumento a la función calculadora() ya que tienen dos argumentos de tipo Int y devuelven un tipo Int tambien.

Por tanto, podemos llamar a la función calculadora con ellas:

val x: Int = 5
val y: Int = 5
println("La suma de $x y $y es: ${calculadora(x, y, ::suma)}")
println("La resta de $x y $y es: ${calculadora(x, y, ::resta)}")
println("La multiplicación de $x por $y es: ${calculadora(x, y, ::mult)}")
println("La división de $x entre $y es: ${calculadora(x, y, ::divis)}")

/*Respuesta
La suma de 5 y 5 es: 10
La resta de 5 y 5 es: 0
La multiplicación de 5 por 5 es: 25
La división de 5 entre 5 es: 1 */

El operador ::

Se utiliza para la reflexión en Kotlin. (En enlace es externo pero muy útil)

En este caso, se utiliza la expresión ::nombreFuncion para acceder a su referencia y pasarla en lugares que permitan literales de función.

Last updated