Els Tipus de Dades Algebraics (ADTs, per les seves sigles en anglès) són una característica fonamental en Haskell que permet definir tipus de dades complexos de manera clara i concisa. Els ADTs es divideixen principalment en dos tipus: tipus de dades producte i tipus de dades suma.

Tipus de Dades Producte

Els tipus de dades producte permeten agrupar diversos valors en una sola estructura. Un exemple comú és una tupla, però també podem definir els nostres propis tipus de dades producte utilitzant la paraula clau data.

Exemple: Definició d'un Punt en un Pla Cartesià

data Point = Point Float Float

En aquest exemple, Point és un tipus de dades que conté dos valors de tipus Float. Podem crear un valor de tipus Point així:

p1 :: Point
p1 = Point 3.0 4.0

Accés als Components

Per accedir als components d'un tipus de dades producte, podem utilitzar la coincidència de patrons:

distanceFromOrigin :: Point -> Float
distanceFromOrigin (Point x y) = sqrt (x^2 + y^2)

Tipus de Dades Suma

Els tipus de dades suma permeten definir un tipus que pot ser un de diversos constructors diferents. Això és útil per representar dades que poden tenir diverses formes.

Exemple: Definició d'una Figura Geomètrica

data Shape = Circle Float
           | Rectangle Float Float

En aquest exemple, Shape pot ser un Circle amb un Float que representa el radi, o un Rectangle amb dos Float que representen l'amplada i l'alçada.

Creació i Ús de Valors

Podem crear valors de tipus Shape així:

c :: Shape
c = Circle 5.0

r :: Shape
r = Rectangle 4.0 6.0

Coincidència de Patrons amb Tipus de Dades Suma

Podem utilitzar la coincidència de patrons per treballar amb valors de tipus Shape:

area :: Shape -> Float
area (Circle r) = pi * r^2
area (Rectangle w h) = w * h

Tipus de Dades Recursius

Els ADTs també poden ser recursius, el que permet definir estructures de dades com llistes o arbres.

Exemple: Definició d'una Llista

data List a = Empty
            | Cons a (List a)

En aquest exemple, List és un tipus de dades recursiu que pot ser Empty o Cons (un element seguit d'una altra llista).

Creació i Ús de Llistes

Podem crear valors de tipus List així:

list1 :: List Int
list1 = Cons 1 (Cons 2 (Cons 3 Empty))

Funció de Sumatori per a una Llista

Podem definir una funció per sumar els elements d'una List utilitzant la coincidència de patrons:

sumList :: List Int -> Int
sumList Empty = 0
sumList (Cons x xs) = x + sumList xs

Exercicis Pràctics

Exercici 1: Definir un Tipus de Dades per a un Arbre Binari

Defineix un tipus de dades BinaryTree que pot ser un EmptyTree o un Node amb un valor i dos subarbres.

data BinaryTree a = EmptyTree
                  | Node a (BinaryTree a) (BinaryTree a)

Exercici 2: Funció per Comptar Nodes

Escriu una funció countNodes que compti el nombre de nodes en un BinaryTree.

countNodes :: BinaryTree a -> Int
countNodes EmptyTree = 0
countNodes (Node _ left right) = 1 + countNodes left + countNodes right

Exercici 3: Funció per Buscar un Valor

Escriu una funció search que busqui un valor en un BinaryTree.

search :: (Eq a) => a -> BinaryTree a -> Bool
search _ EmptyTree = False
search x (Node y left right)
    | x == y    = True
    | otherwise = search x left || search x right

Conclusió

Els Tipus de Dades Algebraics són una eina poderosa en Haskell per definir estructures de dades complexes de manera clara i concisa. Hem vist com definir tipus de dades producte, tipus de dades suma i tipus de dades recursius, així com com utilitzar la coincidència de patrons per treballar amb aquests tipus de dades. Amb aquests coneixements, estàs preparat per crear i manipular estructures de dades més avançades en Haskell.

© Copyright 2024. Tots els drets reservats