En aquest tema, explorarem dos conceptes fonamentals en Haskell: Functor i Foldable. Aquests conceptes són crucials per comprendre com manipular estructures de dades de manera funcional i eficient.

Functor

Què és un Functor?

Un Functor és una estructura que es pot mapar. En altres paraules, és una estructura que permet aplicar una funció a cada element dins d'ella, mantenint la seva estructura original. En Haskell, Functor és una classe de tipus definida de la següent manera:

class Functor f where
    fmap :: (a -> b) -> f a -> f b

Exemple de Functor

Vegem un exemple pràctic amb la llista, que és una instància de Functor:

-- Definim una funció que suma 1 a un nombre
addOne :: Int -> Int
addOne x = x + 1

-- Utilitzem fmap per aplicar addOne a cada element d'una llista
result = fmap addOne [1, 2, 3, 4]
-- result serà [2, 3, 4, 5]

Instància de Functor

Podem definir una instància de Functor per a una estructura de dades personalitzada. Per exemple, considerem un arbre binari:

data Tree a = Empty | Node a (Tree a) (Tree a)

instance Functor Tree where
    fmap _ Empty = Empty
    fmap f (Node x left right) = Node (f x) (fmap f left) (fmap f right)

Exercici Pràctic

Exercici: Defineix una instància de Functor per a l'estructura de dades següent:

data Box a = Box a

instance Functor Box where
    fmap = -- Completa aquesta part

Solució:

instance Functor Box where
    fmap f (Box x) = Box (f x)

Foldable

Què és Foldable?

Foldable és una classe de tipus que representa estructures de dades que es poden plegar (fold). Això significa que podem reduir una estructura de dades a un sol valor aplicant una funció de combinació.

La classe Foldable es defineix així:

class Foldable t where
    foldr :: (a -> b -> b) -> b -> t a -> b

Exemple de Foldable

Vegem un exemple amb la llista, que és una instància de Foldable:

-- Definim una funció que suma dos nombres
add :: Int -> Int -> Int
add x y = x + y

-- Utilitzem foldr per sumar tots els elements d'una llista
result = foldr add 0 [1, 2, 3, 4]
-- result serà 10

Instància de Foldable

Podem definir una instància de Foldable per a una estructura de dades personalitzada. Per exemple, considerem un arbre binari:

data Tree a = Empty | Node a (Tree a) (Tree a)

instance Foldable Tree where
    foldr _ acc Empty = acc
    foldr f acc (Node x left right) = foldr f (f x (foldr f acc right)) left

Exercici Pràctic

Exercici: Defineix una instància de Foldable per a l'estructura de dades següent:

data Box a = Box a

instance Foldable Box where
    foldr = -- Completa aquesta part

Solució:

instance Foldable Box where
    foldr f acc (Box x) = f x acc

Resum

En aquesta secció, hem après sobre Functor i Foldable, dues classes de tipus fonamentals en Haskell que ens permeten manipular estructures de dades de manera funcional. Hem vist com definir instàncies d'aquestes classes per a estructures de dades personalitzades i hem practicat amb exemples concrets.

En el següent mòdul, explorarem més conceptes avançats de programació funcional en Haskell.

© Copyright 2024. Tots els drets reservats