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ó:

class Eq a where
    (==) :: a -> a -> Bool
    (/=) :: a -> a -> Bool

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:

class Show a where
    show :: a -> String

Read

La classe Read s'utilitza per convertir cadenes de text en valors. Aquí teniu la seva definició simplificada:

class Read a where
    read :: String -> a

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.

© Copyright 2024. Tots els drets reservats