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

map :: (a -> b) -> [a] -> [b]

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ó

  1. doble és una funció que pren un enter i retorna el seu doble.
  2. map doble [1, 2, 3, 4, 5] aplica doble 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

filter :: (a -> Bool) -> [a] -> [a]

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ó

  1. esParell és una funció que retorna True si un nombre és parell i False en cas contrari.
  2. 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).

foldl :: (b -> a -> b) -> b -> [a] -> b
foldr :: (a -> b -> b) -> b -> [a] -> b

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ó

  1. foldl suma 0 [1, 2, 3, 4, 5] aplica la funció suma de manera acumulativa des de l'esquerra, començant amb el valor inicial 0, produint 15.
  2. 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.

incrementa :: [Int] -> [Int]
incrementa = map (+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.

nomesPositius :: [Int] -> [Int]
nomesPositius = filter (>0)

Exercici 3: Utilitzant fold

Escriu una funció que, donada una llista de nombres enters, retorni la seva suma.

sumaLlista :: [Int] -> Int
sumaLlista = foldl (+) 0

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.

© Copyright 2024. Tots els drets reservats