Programación funcional : Pattern Matching

El fin de semana pasado, estuve en Madrid en uno de los eventos tecnológicos de referencia, “CodeMotion“.

Asistí a distintas charlas de Java, programación funcional, Scala y alguna de Front. Algunas charlas me aportaron más cosas que otras, pero en todas ellas obtuve la misma conclusión y es que tengo que seguir aprendiendo y mejorando.

Los que trabajamos con lenguajes orientados a objetos, nos cuesta mucho entrar en la programación funcional. Y es que nos faltan muchos conceptos y herramientas de la programación funcional.

Asi que continuando con artículos anteriores del blog (Scala, Java y la programación funcional) donde hablábamos de programación funcional y Scala, vamos a tratar el Pattern Matching.

Pattern Matching

Pattern Matching es un mecanismo de la programación funcional, que nos permite comprobar un valor contrastando contra un patrón.

Está presente en muchos lenguajes que no son puramente funcionales.

Pattern Matching es una secuencia de alternativas, donde cada alternativa implementa un patrón y una o mas expresiones que serán evaluadas si el patrón se cumple.

Vamos a ver un ejemplo en Scala : Tenemos un número aleatorio y queremos obtener una cadena de texto.

En Scala el caracter “_”, tiene muchas utilidades, en concreto en estos ejemplos simboliza cualqueir caracter

val x: Int = Random.nextInt(10)

x match {
  case 0 => "cero"
  case 1 => "uno"
  case 2 => "dos"
  case _ => "cualquiera"
}

¿Y qué me estás contando con esto? Si no es mas que un switch con otra sintaxis?

Cuando yo empecé a leer programación funcional, fue lo primero que pensé … y algo de razón si que tenia. En Java tenemos un switch-case que nos permite tomar alternativas en función de una serie de condiciones. Sin embargo es sólo una aproximación a Pattern Matching ya que nos han limitado su funcionalidad y solo podemos evaluar ciertos tipos como char, boolean, integer, enum o String.

Pattern matching es muuuuucho más potente.

Fijaos … Soy capaz de añadir expresiones en cada patrón



def ejemploCalculadora(x: Char) = x match {
      case '+'                       => "Suma"
      case '-'                       => "Resta"
      case _ if Character.isDigit(x) => "Digito"
      case _                         => "Cualquiera"
}

No tenemos restricciones a la hora de evaluar

def describe(x: Any) = x match {
      case 5 => "five"
      case true => "truth"
      case "hello" => "hi!"
      case Nil => "the empty list"
      case _ => "something else"
    }

E incluso podemos añadir más complejidad a nuestro Pattern Matching y añadir clases y herencia

 abstract class Vehiculo
    case class Coche() extends Vehiculo
    case class Bicicleta() extends Vehiculo

    def elegirVehiculo(x: Vehiculo): String = x match {
      case a: Coche => "Mi objeto es un coche"
      case b: Bicicleta => "Mi objeto es una bicicleta"
    }

¿Os he convencido? ¿A qué no es un simple switch-case?

Si quereis empezar con la programación funcional y Scala, os dejo un repositorio con ejercicios

ScalaPrimerosPasos

Pattern Matching

Post By Rocio Muñoz (36 Posts)

Ingeniera Informatica. Dicen que todos los niños nacen con un pan debajo del brazo ... Yo creo que llevaba un ordenador. Trabajo como programadora en Cic en entornos Java. Apasionada del mundo web y la innovacion social.

Connect

No comments yet.

Deja un comentario

Leave your opinion here. Please be nice. Your Email address will be kept private.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies
Translate »