Currying Functions

Currying Functions

¿Conoces la técnica de programación denominada function currying? En este artículo aprenderemos en qué consiste y cómo la podemos aplicar en nuestros

Function Currying es una de las técnicas de programación más poderosas que tenemos a nuestra disposición cuando estamos desarrollando nuestro código pero desgraciadamente no es muy conocida por un porcentaje elevado de programadores. En este artículo explicaré en qué consiste y para ello vamos a partir de la definición de una función muy sencilla en la que simplemente se estarán sumando los dos números que recibe como parámetros:

function add(numOne + numTwo) {
  return numOne + numTwo
}

¿En qué consiste el currying? Pues básicamente lo que viene a hacer es partir de una función que recibe varios parámetros y transformarla en varias funciones que únicamente recibirán un parámetro. Así, al primera llamada a la currying function que vayamos a construir va a retornar una función que tomará como parámetro el segundo parámetro de la función original que se la pasará a la función original y así se acabará obteniendo el valor final de su invocación.

¿Lioso? ¡Pues sí! Pero para eso vamos a desarrollar nuestro ejemplo. Nuestra función add es una función muy sencilla de JavaScript que toma dos parámetros y los suma. Para poder hacer el currying de esta función lo que vamos a tener que hacer es crear una función que lo único que haga sea retornar el resultado de su invocación:

function add(numOne) {
  return function (numTwo) {
    return numOne + numTwo
  }
}

¡Perfecto! Ya tenemos nuestra currying function pero ahora ¿cómo la vamos a usar? Pues tenemos que pensar en que en primer lugar deberemos hacer una llamada a la función add pasándole como primer parámetro el número que queremos que se vaya a sumar (el primer operando de la suma):

const add10 = add(10)

de tal manera que ahora add10 es una función que recibe como parámetro el número que queramos sumar a 10. Esto nos va a permitir realizar las siguientes llamadas:

const add10Plus2 = add10(2) // 12
const add10Plus4 = add10(4) // 14

donde los valores que ahora tienen asignandas las variables add10Plus2 y add10Plus4 son respectivamente los resultado de sumarle 2 y 4 al valor 10.

Ejemplo práctico

Ahora que sabemos cómo funciona el currying vamos a intentar aplicarlo a un ejemplo más de nuestro día a día a como desarrolladores y para ello pensemos en un método que está asociado a un endpoint de una aplicación backend en Node como el siguiente:

app.put(
  '/api/posts/:postId',
  [validateResource(updatePostHandlerSchema)],
  updatePostHandler
)

En concreto este método lo que está haciendo es definir un endpoint para atender a las peticiones de tipo PUT dentro de una aplicación Express aplicando un validation schema para asegurarse de que los datos que se van a utilizar en la petición son válidos sabiendo que esta validación va a tomar los datos que están recogidos en el objeto request que está asociado a la petición del usuario comprobando que se amoldan a lo que esperábamos.

Veamos por lo tanto la implementación de esta función validateResource que sería algo como lo siguiente:

const validateResource = resourceSchema => async (req, res, next) => {
  try {
    await resourceSchema.validate({
      body: req.body,
      query: req.query,
      params: req.params
    })
    next()
  } catch (error) {
    logger.error(error)
    return res.status(400).send(error)
  }
}

el parámetro resourceSchema (el primero de los parámetros) y la función que retorna estará esperando tres parámetros para su ejecución como son el objeto request, response y la función next de Express.

Por lo tanto estamos viendo como gracias al currying de funciones es muy simple implementar el middleware en frameworks como Express.