Saltar a contenido

Funciones de alto orden

Las funciones de alto orden son aquellas que pueden: - Recibir funciones como parámetros - Retornar funciones como resultado

En Scala, las funciones son valores de primera clase, lo que significa que pueden ser manipuladas como cualquier otro valor (asignadas a variables, pasadas como argumentos, retornadas desde otras funciones).

Función que recibe una función como parámetro

// Definición de una función de alto orden que recibe una función 'f'
// f: (Int, Int) => Int - función que toma dos enteros y devuelve un entero
// x, y: parámetros enteros que se pasarán a la función f
def funcion(f: (Int, Int) => Int, x: Int, y: Int): Int = {
    f(x, y)  // Se invoca la función recibida con los parámetros x e y
}

Función que retorna una función

// Función que toma una función 'f' y dos enteros, y retorna una nueva función
def funcionB(f: (Int, Int) => Int, a: Int, b: Int): (Int, Int) => Int = {
    // Retorna una función anónima (lambda) que captura los valores a, b y f
    (m: Int, n: Int) => f(a + n, b + m)
}

Las funciones como valores

// Definición de funciones básicas
def suma(a: Int, b: Int): Int = a + b
def resta(a: Int, b: Int): Int = a - b

// Las funciones pueden ser referenciadas como valores
val funcionSuma: (Int, Int) => Int = suma _
val funcionResta: (Int, Int) => Int = resta _

// Uso de la función de alto orden con diferentes funciones
funcion(suma, 2, 3)      // Resultado: 5
funcion(resta, 2, 3)     // Resultado: -1
funcion(_ + _, 5, 3)     // Resultado: 8 (usando función anónima)
funcion(_ * _, 4, 5)     // Resultado: 20 (multiplicación anónima)

Ejemplo de función que retorna función

// Crear una función que suma un valor fijo
def crearSumador(fijo: Int): (Int) => Int = {
    (x: Int) => x + fijo  // Retorna una función que suma 'fijo' a su argumento
}

val sumar5 = crearSumador(5)    // Función que suma 5
val sumar10 = crearSumador(10)  // Función que suma 10

sumar5(3)   // Resultado: 8
sumar10(3)  // Resultado: 13

Operaciones con funciones

// Composición de funciones
def doble(x: Int): Int = x * 2
def cuadrado(x: Int): Int = x * x

val dobleYCuadrado: Int => Int = (x: Int) => cuadrado(doble(x))
val cuadradoYDoble: Int => Int = (x: Int) => doble(cuadrado(x))

dobleYCuadrado(3)  // (3*2)^2 = 36
cuadradoYDoble(3)  // (3^2)*2 = 18

La característica esencial es que las funciones son valores cuya única operación disponible es evaluarlas o invocarlas. Esto permite un alto grado de abstracción y reutilización de código.