En Scala, las funciones de orden superior (high order functions) son funciones que toman una o más funciones como argumentos o devuelven una función como resultado. Las funciones de orden superior son una de las características más poderosas de Scala y son muy útiles para escribir código más legible, modular y reutilizable.
En Scala, las funciones son ciudadanos de primera clase, lo que significa que pueden ser tratadas como cualquier otro tipo de valor, como una cadena, un entero o una lista. Las funciones pueden ser asignadas a variables, pasadas como argumentos a otras funciones, devueltas como resultados de otras funciones y almacenadas en estructuras de datos.
Veamos algunos ejemplos de funciones de orden superior en Scala:
// Ejemplo de función que toma otra función como argumento
def applyTwice(f: Int => Int, x: Int): Int = f(f(x))
def square(x: Int): Int = x * x
val result = applyTwice(square, 2) // result: Int = 16
// Ejemplo de función que devuelve otra función como resultado
def createMultiplier(factor: Int): Int => Int = (x: Int) => x * factor
val double = createMultiplier(2)
val triple = createMultiplier(3)
val result1 = double(5) // result1: Int = 10
val result2 = triple(5) // result2: Int = 15
En el primer ejemplo, applyTwice
es una función de orden superior que toma otra función f
y un argumento x
. La función applyTwice
llama a f
dos veces con el argumento x
, y devuelve el resultado final. En este ejemplo, square
es la función que se pasa como argumento a applyTwice
, y result
es el resultado de aplicar la función square
dos veces al número 2
.
En el segundo ejemplo, createMultiplier
es una función de orden superior que devuelve una función. La función devuelta toma un argumento x
y devuelve x
multiplicado por factor
. En este ejemplo, double
y triple
son dos funciones creadas usando createMultiplier
, y se utilizan para multiplicar un número por 2 y por 3, respectivamente.
Las funciones de orden superior son muy útiles en Scala para escribir código modular y reutilizable. Al utilizar funciones de orden superior, podemos pasar la lógica específica de una tarea a una función separada y reutilizarla en diferentes partes del código. Esto hace que nuestro código sea más fácil de mantener y evita la duplicación de código.