La programación funcional parece volver a brillar. Y para que mentirnos, nos encanta ver brillar diferentes paradigmas de programación. Cada paradigma, cada lenguaje, cada artista (programador) nos permite aprender una forma diferente de solucionar problemas. Si no conoces nada sobre la programación funcional vamos a introducir los conceptos más básicos, y si la conoces es un simple repaso.

La programación funcional tiene diversos asuntos dignos de destacar. El primero, es una caja negra. Con unas entradas nos da unas salidas. El segundo, mónadas. Una de las soluciones para poder definir diferentes retornos desde una función definiendo que sucedió. Por último, búsqueda de patrones (o pattern matching). Busca patrones con el valor dado para realizar acciones. Vamos a analizar cada uno de estos asuntos.

Definición de programación funcional

La programación funcional es un paradigma de programación muy ligada a las matemáticas. Se basa en sucesión de funciones eliminando posible efectos colaterales. Si se realiza una programación funcional pura, no debería de existir ningún tipo de problema, ya que dada una entrada siempre devolverá el mismo valor.

Por otra parte, la programación funcional no es sólo para lenguajes funcionales, como Haskell o Elixir. Cualquier lenguaje puede adaptarse a la programación funcional, desde Python pasando por Java.

Mónadas

Las mónadas son un elemento básico y esencial para la programación funcional. Tenemos una función que puede devolver un error. La solución son las mónadas. Un ejemplo clásico es Maybe. Es una mónada que define Just y Nothing. Si esto se une con la búsqueda de patrones, tenemos una solución muy potente para definir todo tipo de funciónes en función de las entradas. Si devuelve un valor devolverá un Just con el valor “dentro”, en cualquier otra caso devolverá Nothing.

Su uso es básico, tenemos una serie de valores esperados para cada mónada. Cada función que tenga de entrada esta mónada deberá definir qué hacer en cada caso.

Búsqueda de patrones (o pattern matching)

La mayor potencia de la programación funcional, y cualquier lenguaje que lo implemente, es la búsqueda de patrones. La búsqueda de patrones nos permite definir una función recursiva para cada uno de los casos de forma sencilla. Tenemos un ejemplo explicado en este artículo recursividad en los lenguajes funcionales.

Otro ejemplo bastante potente está en Scala. Te permite definir un valor a partir del pattern matching, sería una sentencia switch pero vitaminada. Vamos a poner un ejemplo de la propia documentación de Scala:

def showNotification(notification: Notification): String = {
  notification match {
    case Email(sender, title, _) =>
      s"You got an email from $sender with title: $title"
    case SMS(number, message) =>
      s"You got an SMS from $number! Message: $message"
    case VoiceRecording(name, link) =>
      s"You received a Voice Recording from $name! Click the link to hear it: $link"
  }
}

Al realizar el pattern matching se puede ver qué tipo de notificación es y extraer los datos que necesitamos del objeto, en este caso una case class.

Así mismo, en la búsqueda de patrones se puede añadir un patrón que contenga cualquier elemento. De esta forma se puede definir una actuación en caso de no ser un valor esperado. Si se estuviese usando la mónada Maybe devolvería Nothing.

Conclusiones

El paradigma funcional nos permite ver el mundo con otra perspectiva. Cuantos más paradigmas se conocen más formas de abordar un problema, por lo tanto, podrá encontrar una mejor solución para el problema.

Tiene un gran potencial gracias al aumento de lenguajes que permiten tomar ideas funcionales en él, y el despunte de lenguajes para el análisis de datos.