En aquest tema, explorarem el concepte de "guards" en Haskell. Els guards són una manera elegant i llegible de gestionar condicions múltiples en les definicions de funcions. Són similars a les estructures if-else que es troben en altres llenguatges de programació, però amb una sintaxi més clara i concisa.

Conceptes Clau

  • Guards: Són expressions booleanes que es col·loquen després del símbol | i s'utilitzen per seleccionar entre diverses alternatives en una funció.
  • Otherwise: És una guard especial que sempre és certa i s'utilitza com a cas per defecte.

Sintaxi de Guards

La sintaxi bàsica per utilitzar guards en Haskell és la següent:

funció :: Tipus -> Tipus
funció paràmetre
  | condició1 = resultat1
  | condició2 = resultat2
  | otherwise = resultatPerDefecte

Exemple Pràctic

Vegem un exemple pràctic per entendre millor com funcionen els guards. Suposem que volem definir una funció que classifiqui una nota numèrica en una lletra (A, B, C, D, F).

classificaNota :: Int -> Char
classificaNota nota
  | nota >= 90 = 'A'
  | nota >= 80 = 'B'
  | nota >= 70 = 'C'
  | nota >= 60 = 'D'
  | otherwise  = 'F'

Explicació del Codi

  1. Definició de la funció: classificaNota pren un enter (Int) com a entrada i retorna un caràcter (Char).
  2. Guards:
    • nota >= 90 = 'A': Si la nota és 90 o superior, retorna 'A'.
    • nota >= 80 = 'B': Si la nota és entre 80 i 89, retorna 'B'.
    • nota >= 70 = 'C': Si la nota és entre 70 i 79, retorna 'C'.
    • nota >= 60 = 'D': Si la nota és entre 60 i 69, retorna 'D'.
    • otherwise = 'F': Si cap de les condicions anteriors es compleix, retorna 'F'.

Exercicis Pràctics

Exercici 1: Classificació de Temperatures

Defineix una funció classificaTemperatura que classifiqui una temperatura en graus Celsius com a "Fred", "Tèbia" o "Calor".

classificaTemperatura :: Int -> String
classificaTemperatura temp
  | temp <= 0  = "Fred"
  | temp <= 20 = "Tèbia"
  | otherwise  = "Calor"

Exercici 2: Determinació de Paritat

Defineix una funció paritat que determini si un nombre és parell o senar.

paritat :: Int -> String
paritat n
  | n `mod` 2 == 0 = "Parell"
  | otherwise      = "Sennar"

Solucions dels Exercicis

Solució de l'Exercici 1

classificaTemperatura :: Int -> String
classificaTemperatura temp
  | temp <= 0  = "Fred"
  | temp <= 20 = "Tèbia"
  | otherwise  = "Calor"

Solució de l'Exercici 2

paritat :: Int -> String
paritat n
  | n `mod` 2 == 0 = "Parell"
  | otherwise      = "Sennar"

Errors Comuns i Consells

  • Oblidar el otherwise: Si no inclous un cas per defecte (otherwise), la funció pot no cobrir tots els casos possibles, la qual cosa pot provocar errors en temps d'execució.
  • Condicions superposades: Assegura't que les condicions dels guards no es superposin de manera que només una condició sigui certa per a qualsevol entrada donada.

Conclusió

Els guards són una eina poderosa en Haskell per gestionar condicions múltiples de manera clara i concisa. Amb una comprensió sòlida dels guards, pots escriure funcions més llegibles i mantenibles. En el següent tema, explorarem les funcions d'ordre superior, que són una part fonamental de la programació funcional en Haskell.

© Copyright 2024. Tots els drets reservats