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:
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:
Solució:
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í:
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:
Solució:
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.