Les classes de tipus són un dels conceptes més poderosos i distintius de Haskell. Permeten definir comportaments genèrics que poden ser implementats per diferents tipus de dades. En aquest tema, explorarem què són les classes de tipus, com es defineixen i com es poden utilitzar per crear codi més flexible i reutilitzable.
Què és una Classe de Tipus?
Una classe de tipus és una col·lecció de funcions que poden ser implementades per diferents tipus de dades. Les classes de tipus defineixen un conjunt de comportaments que els tipus que en formen part han de proporcionar.
Exemple de Classe de Tipus: Eq
La classe de tipus Eq
defineix la igualtat i la desigualtat. Aquí teniu la seva definició:
Aquesta definició diu que qualsevol tipus a
que sigui una instància de Eq
ha de proporcionar implementacions per a les funcions (==)
i (/=)
.
Definint una Instància de Classe de Tipus
Per fer que un tipus sigui una instància d'una classe de tipus, hem de proporcionar implementacions per a les funcions definides en la classe. Vegem un exemple amb un tipus de dades personalitzat:
data Color = Red | Green | Blue instance Eq Color where Red == Red = True Green == Green = True Blue == Blue = True _ == _ = False x /= y = not (x == y)
En aquest exemple, fem que el tipus Color
sigui una instància de la classe Eq
proporcionant implementacions per a (==)
i (/=)
.
Classes de Tipus Comunes
Haskell ve amb diverses classes de tipus predefinides que són àmpliament utilitzades. Aquí teniu algunes de les més comunes:
Ord
La classe Ord
s'utilitza per definir una relació d'ordre entre elements. Aquí teniu la seva definició simplificada:
class Eq a => Ord a where compare :: a -> a -> Ordering (<) :: a -> a -> Bool (<=) :: a -> a -> Bool (>) :: a -> a -> Bool (>=) :: a -> a -> Bool
Show
La classe Show
s'utilitza per convertir valors en cadenes de text. Aquí teniu la seva definició simplificada:
Read
La classe Read
s'utilitza per convertir cadenes de text en valors. Aquí teniu la seva definició simplificada:
Definint Classes de Tipus Personalitzades
També podem definir les nostres pròpies classes de tipus. Vegem un exemple:
class Describable a where describe :: a -> String data Person = Person { name :: String, age :: Int } instance Describable Person where describe (Person name age) = name ++ " is " ++ show age ++ " years old."
En aquest exemple, definim una classe de tipus Describable
amb una funció describe
. A continuació, fem que el tipus Person
sigui una instància de Describable
proporcionant una implementació per a describe
.
Exercicis Pràctics
Exercici 1: Definir una Instància de Show
Definiu una instància de la classe Show
per al tipus Color
que hem definit anteriorment.
data Color = Red | Green | Blue instance Show Color where show Red = "Red" show Green = "Green" show Blue = "Blue"
Exercici 2: Crear una Classe de Tipus Personalitzada
Creeu una classe de tipus Measurable
que defineixi una funció measure
i feu que el tipus Rectangle
sigui una instància d'aquesta classe.
class Measurable a where measure :: a -> Double data Rectangle = Rectangle { width :: Double, height :: Double } instance Measurable Rectangle where measure (Rectangle width height) = width * height
Resum
En aquesta secció, hem après què són les classes de tipus i com es poden utilitzar per definir comportaments genèrics en Haskell. Hem vist exemples de classes de tipus predefinides com Eq
, Ord
, Show
i Read
, i hem après a definir les nostres pròpies classes de tipus personalitzades. També hem practicat definint instàncies de classes de tipus per a tipus de dades personalitzats.
En el següent tema, explorarem els tipus de dades algebraics, que ens permetran definir estructures de dades més complexes en Haskell.