La coincidència de patrons és una característica poderosa i fonamental en Haskell que permet descompondre estructures de dades de manera clara i concisa. Aquesta tècnica és àmpliament utilitzada per definir funcions, treballar amb llistes, tuples i altres tipus de dades.

Conceptes Clau

  1. Patrons Simples: Coincidència amb valors literals.
  2. Patrons de Llistes: Coincidència amb estructures de llistes.
  3. Patrons de Tuples: Coincidència amb tuples.
  4. Patrons de Constructors: Coincidència amb constructors de tipus de dades algebraics.
  5. Patrons amb Variables: Assignació de parts de l'estructura a variables.

  1. Patrons Simples

Els patrons simples coincideixen amb valors literals. Per exemple:

esZero :: Int -> Bool
esZero 0 = True
esZero _ = False

En aquest exemple, la funció esZero retorna True si l'entrada és 0 i False per a qualsevol altre valor.

  1. Patrons de Llistes

La coincidència de patrons amb llistes permet descompondre llistes en els seus components:

llargada :: [a] -> Int
llargada [] = 0
llargada (_:xs) = 1 + llargada xs

Aquí, la funció llargada calcula la longitud d'una llista. Si la llista és buida ([]), retorna 0. Si la llista té almenys un element (_:xs), incrementa el comptador i crida recursivament a llargada amb la resta de la llista (xs).

  1. Patrons de Tuples

La coincidència de patrons amb tuples permet descompondre tuples en els seus components:

sumaTupla :: (Int, Int) -> Int
sumaTupla (x, y) = x + y

En aquest exemple, la funció sumaTupla pren una tupla de dos enters i retorna la seva suma.

  1. Patrons de Constructors

Els constructors de tipus de dades algebraics també poden ser utilitzats en la coincidència de patrons:

data Color = Vermell | Verd | Blau

esVermell :: Color -> Bool
esVermell Vermell = True
esVermell _ = False

Aquí, esVermell retorna True si l'entrada és Vermell i False per a qualsevol altre valor de Color.

  1. Patrons amb Variables

Les variables en patrons permeten capturar parts de l'estructura de dades:

primerElement :: [a] -> Maybe a
primerElement [] = Nothing
primerElement (x:_) = Just x

En aquest exemple, primerElement retorna Nothing si la llista és buida, i Just x si la llista té almenys un element, on x és el primer element de la llista.

Exercicis Pràctics

Exercici 1: Coincidència de Patrons amb Llistes

Defineix una funció capICua que retorni una tupla amb el primer i l'últim element d'una llista. Si la llista és buida, retorna Nothing.

capICua :: [a] -> Maybe (a, a)
capICua [] = Nothing
capICua [x] = Just (x, x)
capICua (x:xs) = Just (x, last xs)

Exercici 2: Coincidència de Patrons amb Constructors

Defineix un tipus de dades Forma amb constructors Cercle i Rectangle. Escriu una funció area que calculi l'àrea d'una Forma.

data Forma = Cercle Float | Rectangle Float Float

area :: Forma -> Float
area (Cercle r) = pi * r * r
area (Rectangle a b) = a * b

Resum

La coincidència de patrons és una eina poderosa en Haskell que permet descompondre estructures de dades de manera clara i concisa. Hem vist com utilitzar patrons simples, de llistes, de tuples, de constructors i amb variables. A més, hem practicat amb exercicis per reforçar aquests conceptes.

En el següent tema, explorarem els Guards, una altra característica important per definir funcions de manera més expressiva.

© Copyright 2024. Tots els drets reservats