En aquest tema, explorarem tres de les funcions més importants i utilitzades en la programació funcional: map
, filter
i fold
. Aquestes funcions permeten manipular llistes de manera eficient i expressiva.
Map
La funció map
aplica una funció a cada element d'una llista, retornant una nova llista amb els resultats.
Sintaxi
Exemple
-- Definim una funció que multiplica un nombre per 2 doble :: Int -> Int doble x = x * 2 -- Utilitzem map per aplicar 'doble' a cada element d'una llista resultat = map doble [1, 2, 3, 4, 5] -- [2, 4, 6, 8, 10]
Explicació
doble
és una funció que pren un enter i retorna el seu doble.map doble [1, 2, 3, 4, 5]
aplicadoble
a cada element de la llista[1, 2, 3, 4, 5]
, produint[2, 4, 6, 8, 10]
.
Filter
La funció filter
selecciona els elements d'una llista que compleixen una certa condició (predicat).
Sintaxi
Exemple
-- Definim una funció que determina si un nombre és parell esParell :: Int -> Bool esParell x = x `mod` 2 == 0 -- Utilitzem filter per seleccionar només els nombres parells d'una llista resultat = filter esParell [1, 2, 3, 4, 5, 6] -- [2, 4, 6]
Explicació
esParell
és una funció que retornaTrue
si un nombre és parell iFalse
en cas contrari.filter esParell [1, 2, 3, 4, 5, 6]
selecciona només els elements parells de la llista[1, 2, 3, 4, 5, 6]
, produint[2, 4, 6]
.
Fold
La funció fold
(també coneguda com a reduce
en altres llenguatges) combina els elements d'una llista utilitzant una funció binària i un valor inicial.
Sintaxi
Hi ha dues variants principals de fold
en Haskell: foldl
(fold left) i foldr
(fold right).
Exemple amb foldl
-- Definim una funció que suma dos nombres suma :: Int -> Int -> Int suma x y = x + y -- Utilitzem foldl per sumar tots els elements d'una llista resultat = foldl suma 0 [1, 2, 3, 4, 5] -- 15
Exemple amb foldr
-- Definim una funció que concatena dues cadenes concatena :: String -> String -> String concatena x y = x ++ y -- Utilitzem foldr per concatenar una llista de cadenes resultat = foldr concatena "" ["Hola", " ", "món", "!"] -- "Hola món!"
Explicació
foldl suma 0 [1, 2, 3, 4, 5]
aplica la funciósuma
de manera acumulativa des de l'esquerra, començant amb el valor inicial0
, produint15
.foldr concatena "" ["Hola", " ", "món", "!"]
aplica la funcióconcatena
de manera acumulativa des de la dreta, començant amb el valor inicial""
, produint"Hola món!"
.
Exercicis Pràctics
Exercici 1: Utilitzant map
Escriu una funció que, donada una llista de nombres enters, retorni una nova llista amb cada nombre incrementat en 1.
Exercici 2: Utilitzant filter
Escriu una funció que, donada una llista de nombres enters, retorni una nova llista amb només els nombres positius.
Exercici 3: Utilitzant fold
Escriu una funció que, donada una llista de nombres enters, retorni la seva suma.
Resum
En aquest tema, hem après a utilitzar tres funcions fonamentals en la programació funcional amb Haskell: map
, filter
i fold
. Aquestes funcions ens permeten manipular llistes de manera eficient i expressiva, aplicant funcions a cada element, seleccionant elements que compleixen una condició i combinant elements utilitzant una funció binària. Amb aquests conceptes, estem ben preparats per abordar problemes més complexos en la programació funcional.