Bitácora

Octava clase

22 de Mayo, 2023

Tarea para la clase que viene:

¿Qué vimos hoy?

Practicamos con el simulacro de parcial Haskell Chef.

Funciones para modificar un campo de una estructura

En parciales es muy común que tengamos estructuras de datos complejos y se repita la idea de querer “modificar” uno de los campos de esta estructura. Por ejemplo, si tenemos una persona con nombre, apellido y edad y queremos hacer que cumpla años o duplicar su edad o hacer que cumpla 100 años, etc. Estas funciones terminarían con una lógica muy similar entre sí:

cumplirAños :: Persona -> Persona
cumplirAños    unaPersona = unaPersona { edad = edad unaPersona + 1 }

duplicarEdad :: Persona -> Persona
duplicarEdad   unaPersona = unaPersona { edad = edad unaPersona * 2 }

cumplir100Años :: Persona -> Persona
cumplir100Años unaPersona = unaPersona { edad = 100 }

¡Esta repetición de lógica la podemos evitar de la misma forma que siempre! 🙌 Extrayendo la lógica común en una función.

modificarEdad :: (Int -> Int) -> Persona -> Persona
modificarEdad unaFuncion unaPersona = unaPersona { edad = unaFuncion . edad $ unaPersona }

Ahora, podemos escribir nuestras funciones anteriores en función de modificarEdad:

cumplirAños :: Persona -> Persona
cumplirAños    unaPersona = modificarEdad (+ 1) unaPersona

duplicarEdad :: Persona -> Persona
duplicarEdad   unaPersona = modificarEdad (* 2) unaPersona

cumplir100Años :: Persona -> Persona
cumplir100Años unaPersona = modificarEdad (const 100) unaPersona

El crear estas funciones auxiliares nos trae un montón de ventajas:

  • Evitamos la repetición de lógica.
  • Nos facilita usar composición (en el caso que queramos modificar dos campos distintos a la vez, sólo necesitamos componer dos de estas funciones).
  • Agrega una pequeña capa de abstracción entre nuestra lógica de dominio y la estructura de nuestros datos. Esto hace que si nuestra estructura cambia, las únicas funciones que se ven afectadas son las auxiliares, y no las de dominio.

Podes ver nuestro github acá.

Y saber mas sobre nosotros acá