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à
En aquest exemple, Point
és un tipus de dades que conté dos valors de tipus Float
. Podem crear un valor de tipus Point
així:
Accés als Components
Per accedir als components d'un tipus de dades producte, podem utilitzar la coincidència de patrons:
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
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í:
Coincidència de Patrons amb Tipus de Dades Suma
Podem utilitzar la coincidència de patrons per treballar amb valors de tipus Shape
:
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
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í:
Funció de Sumatori per a una Llista
Podem definir una funció per sumar els elements d'una List
utilitzant la coincidència de patrons:
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.
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.