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
- Sintaxis de Guardas: Las guardas se introducen con el símbolo
|
seguido de una condición booleana. - Uso de
otherwise
:otherwise
es una guarda que siempre se evalúa comoTrue
y se utiliza como caso por defecto. - 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.
Explicación del Código
- Definición de la función:
signo :: Int -> String
indica quesigno
es una función que toma un entero y devuelve una cadena. - Guardas:
| x > 0 = "Positivo"
: Six
es mayor que 0, la función devuelve "Positivo".| x < 0 = "Negativo"
: Six
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 queimc
es una función que toma dosDouble
(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 localindice
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 quecalificacion
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.
Curso de Programación en Haskell
Módulo 1: Introducción a Haskell
- ¿Qué es Haskell?
- Configuración del Entorno de Haskell
- Sintaxis Básica y Hola Mundo
- Haskell REPL (GHCi)