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]aplicadoblea 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 retornaTruesi un nombre és parell iFalseen 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ósumade manera acumulativa des de l'esquerra, començant amb el valor inicial0, produint15.foldr concatena "" ["Hola", " ", "món", "!"]aplica la funcióconcatenade 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.
