En Haskell, las guardas son una forma de hacer que las funciones sean más expresivas y legibles. Permiten especificar condiciones que deben cumplirse para que se ejecute una determinada rama de una función. Las guardas se utilizan comúnmente en combinación con la coincidencia de patrones para definir comportamientos específicos basados en condiciones.

Conceptos Clave

  1. Sintaxis de Guardas: Las guardas se introducen con el símbolo | seguido de una condición booleana.
  2. Uso de otherwise: otherwise es una guarda que siempre se evalúa como True y se utiliza como caso por defecto.
  3. Evaluación de Guardas: Las guardas se evalúan en orden, y la primera que se evalúa como True determina el resultado de la función.

Ejemplo Básico

Vamos a ver un ejemplo simple de una función que clasifica un número como positivo, negativo o cero utilizando guardas.

signo :: Int -> String
signo x
  | x > 0     = "Positivo"
  | x < 0     = "Negativo"
  | otherwise = "Cero"

Explicación del Código

  • Definición de la función: signo :: Int -> String indica que signo es una función que toma un entero y devuelve una cadena.
  • Guardas:
    • | x > 0 = "Positivo": Si x es mayor que 0, la función devuelve "Positivo".
    • | x < 0 = "Negativo": Si x es menor que 0, la función devuelve "Negativo".
    • | otherwise = "Cero": Si ninguna de las condiciones anteriores se cumple, la función devuelve "Cero".

Ejemplo Práctico

Vamos a crear una función que calcule el índice de masa corporal (IMC) y clasifique el resultado en diferentes categorías.

imc :: Double -> Double -> String
imc peso altura
  | indice < 18.5 = "Bajo peso"
  | indice < 25.0 = "Normal"
  | indice < 30.0 = "Sobrepeso"
  | otherwise     = "Obesidad"
  where indice = peso / (altura ^ 2)

Explicación del Código

  • Definición de la función: imc :: Double -> Double -> String indica que imc es una función que toma dos Double (peso y altura) y devuelve una cadena.
  • Guardas:
    • | indice < 18.5 = "Bajo peso": Si el índice es menor que 18.5, la función devuelve "Bajo peso".
    • | indice < 25.0 = "Normal": Si el índice es menor que 25.0, la función devuelve "Normal".
    • | indice < 30.0 = "Sobrepeso": Si el índice es menor que 30.0, la función devuelve "Sobrepeso".
    • | otherwise = "Obesidad": Si ninguna de las condiciones anteriores se cumple, la función devuelve "Obesidad".
  • Cláusula where: where indice = peso / (altura ^ 2) define una variable local indice que se utiliza en las guardas.

Ejercicio Práctico

Ejercicio 1

Escribe una función calificacion que tome una puntuación (de 0 a 100) y devuelva una cadena que represente la calificación (A, B, C, D, F) basada en la siguiente tabla:

Puntuación Calificación
90-100 A
80-89 B
70-79 C
60-69 D
0-59 F

Solución

calificacion :: Int -> String
calificacion puntuacion
  | puntuacion >= 90 = "A"
  | puntuacion >= 80 = "B"
  | puntuacion >= 70 = "C"
  | puntuacion >= 60 = "D"
  | otherwise        = "F"

Explicación del Código

  • Definición de la función: calificacion :: Int -> String indica que calificacion es una función que toma un entero y devuelve una cadena.
  • Guardas:
    • | puntuacion >= 90 = "A": Si la puntuación es mayor o igual a 90, la función devuelve "A".
    • | puntuacion >= 80 = "B": Si la puntuación es mayor o igual a 80, la función devuelve "B".
    • | puntuacion >= 70 = "C": Si la puntuación es mayor o igual a 70, la función devuelve "C".
    • | puntuacion >= 60 = "D": Si la puntuación es mayor o igual a 60, la función devuelve "D".
    • | otherwise = "F": Si ninguna de las condiciones anteriores se cumple, la función devuelve "F".

Resumen

En esta sección, hemos aprendido sobre las guardas en Haskell, una herramienta poderosa para hacer que nuestras funciones sean más expresivas y legibles. Hemos visto cómo se utilizan las guardas para definir condiciones específicas y cómo se evalúan en orden. Además, hemos trabajado con ejemplos prácticos y ejercicios para reforzar estos conceptos.

En la siguiente sección, exploraremos más sobre los fundamentos de la programación funcional en Haskell, comenzando con las funciones de orden superior.

© Copyright 2024. Todos los derechos reservados