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 -> BoolShow
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 * heightResum
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.
