Zurra

curry

> Tutorial de LeekScript

*Esta página está parcialmente obsoleta. En Leekscript, el curry solo se usa para hacer el código más legible, ya no guarda operaciones ya que el costo de una llamada a una función se reduce a 1 independientemente de la cantidad de parámetros. *

En la programación funcional, curry se refiere a la operación que lleva una función de varios argumentos a una función de un argumento y devuelve una función que toma el resto de los argumentos. La operación inversa es obviamente posible y se llama decurrificación.

El término proviene del nombre del matemático estadounidense Haskell Curry.

Ejemplo en Leekscript

Tomemos una función que toma 2 argumentos y devuelve la suma de los 2:

función suma(x, y) { devuelve x+y; }

Se convierte en método curry

function sumar_curred(x) { función de retorno (y) { devuelve x+y; }; }

Ejemplo de uso

//Método clásico var suma = suma(1, 3);

//Método de curry var agregar1 = agregar_curred(1); var suma = suma1(3);

Este ejemplo es solo para mostrar cómo funciona, en este caso no tiene sentido pasar por curry. Veamos otro ejemplo más interesante. Imagina que tenemos una matriz de n elementos numéricos y queremos sumar 1 a todos los elementos.

//Método clásico for (clave var: elemento var en la matriz) { matriz[clave] = agregar(1, elemento); }

//Método de curry var agregar1 = agregar_curred(1); for (clave var: elemento var en la matriz) { array[clave] = add1(elemento); }

La ventaja aquí se ve en términos de optimización, en el bucle en lugar de llamar a una función con 2 parámetros, solo llamamos a una función con un parámetro. Cuanto mayor sea el número de elementos en la matriz, mayor será la ganancia.

¿Cuándo vale la pena curry?

Como hemos visto anteriormente, el uso principal es para funciones llamadas en bucles y uno o más de cuyos parámetros no dependen del bucle. Memoization es un ejemplo perfecto de uso.

Tomemos como ejemplo nuestra función lineOfSight con memorización (definida aquí):

Si llamamos a esta función en un bucle, ¡las dos operaciones nos pesarán! Currification nos puede ayudar a:

Nuestra función devuelve otra función, que puede usar los parámetros de la primera, es un poco difícil de entender la primera vez, pero si se usa bien, ¡este método es muy efectivo! Un pequeño ejercicio: podemos optimizar esta función aún más, ¡depende de usted descubrir cómo!