Introducción:
en general, durante la programación, usamos funciones de primera clase, lo que significa que el lenguaje de programación trata las funciones como valores, que puede asignar una función a una variable, pasarla. Estas funciones no toman otras funciones como parámetros y nunca tienen ninguna función como tipo de devolución. Para superar todas estas deficiencias de las funciones de primera clase, se introdujo el concepto de función de orden superior.
¿Por qué los necesitamos?
En los lenguajes de programación imperativa como ( C/C++ ), usamos funciones con mucha frecuencia o, de hecho, podemos decir que las funciones juegan un papel importante cuando programamos en estos lenguajes. Una función típica se puede definir por el nombre de la función, su tipo de retorno y los parámetros que toma. Por lo general, damos int, char, puntero, etc. como parámetro, pero ¿es posible dar una función como parámetro a otra función o puede una función devolver otra función como resultado?
¡La respuesta es sí! Las funciones que toman al menos una función como parámetro o devuelven una función como resultado o realizan ambas funciones se denominan funciones de orden superior. Muchos lenguajes, incluidos Javascript , Go , Haskell, Python , C++ , C# , etc., admiten funciones de orden superior. Es una gran herramienta cuando se trata de programación funcional.
Currying: las
funciones se pueden clasificar en función de la cantidad de entradas que aceptan, como la función binaria tomará dos entradas, mientras que una función unaria tomará solo una entrada. En Haskell, cada función toma solo una entrada, es decir, cada función en Haskell se puede decir unaria. Entonces, ¿no es posible implementar una función que tome múltiples parámetros? Por supuesto, es posible, mediante una metodología llamada curry (llamada así por Haskell Curry, científico que popularizó esta metodología e inventó Haskell). Al currear, cada función toma solo un argumento y devuelve una función. Mientras que la última función de esta serie devolverá la salida deseada.
Currying es la metodología de traducir la evaluación de una función que toma múltiples argumentos para evaluar una secuencia de funciones, cada una con un solo argumento.
Un ejemplo simple de Currying:
Tomemos un ejemplo, PLUS es una función que suma dos números
- Deseamos sumar dos números X e Y. X será la entrada a la función MÁS que devuelve una función llamada MÁS X.
- La función PLUS X toma un número y le agrega X. Ahora la entrada a esta función será Y. La salida final será X + Y.
Ventajas de las funciones de orden superior:
Mediante el uso de funciones de orden superior, podemos resolver muchos problemas fácilmente. Por ejemplo, necesitamos crear una función que tome una lista y otra función como entrada, aplique esa función a cada elemento de esa lista y devuelva la nueva lista. En Haskell, esto podría hacerse muy fácilmente utilizando la función de orden superior incorporada llamada mapa. La definición de mapa es:
map :: (a -> b) -> [a] -> [b] map _ [ ] = [ ] map f (x : xs) = f x : map f xs
Aquí,
- La primera línea es la inicialización de la función.
- El símbolo :: significa «es del tipo».
- [a] representa una lista de elementos similares, la entidad escrita después del último -> es siempre el tipo de devolución de la función. Una función en Haskell siempre devuelve solo una entidad.
- (a->b) define una función de ‘a’ a ‘b’. Usamos la recurrencia para definir el mapa,
[] denota una lista vacía y _ denota «cualquier cosa». - La segunda línea muestra que si se ingresa una lista vacía y cualquier función, la salida será una lista vacía.
- x: xs se usa para sacar elementos uno por uno de la lista, x es el primer elemento (cabeza) y xs es la lista restante (cola). : signo significa concatenación. Entonces, en pocas palabras, la tercera línea toma cada elemento de la lista y les aplica la función ‘f’ y los concatena con la lista restante.
Ejemplo:
map (+7) [1, 2, 3, 4, 5] will return the list [8, 9, 10, 11, 12]. Here +7 is the function.