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
No comments yet.