Les funcions d'ordre superior són un concepte fonamental en la programació funcional i, per tant, en Haskell. Aquestes funcions són aquelles que poden prendre altres funcions com a arguments i/o retornar funcions com a resultat. Això permet una gran flexibilitat i potència en la manera com es poden construir i combinar les funcions.
Conceptes Clau
- Funcions com a Primers Ciutadans: En Haskell, les funcions són tractades com a valors de primera classe, el que significa que poden ser passades com a arguments a altres funcions, retornades com a resultats, i assignades a variables.
- Funcions d'Ordre Superior: Aquestes són funcions que prenen una o més funcions com a arguments o que retornen una funció com a resultat.
Exemples Pràctics
Exemple 1: Funció que Pren una Funció com a Argument
-- Definim una funció que pren una funció i un valor, i aplica la funció al valor applyTwice :: (a -> a) -> a -> a applyTwice f x = f (f x) -- Exemple d'ús double :: Int -> Int double x = x * 2 main = print (applyTwice double 3) -- Sortida: 12
Explicació:
applyTwice
és una funció d'ordre superior que pren una funcióf
i un valorx
, i aplicaf
dues vegades ax
.double
és una funció que duplica un nombre.- Quan cridem
applyTwice double 3
, el resultat ésdouble (double 3)
, que és12
.
Exemple 2: Funció que Retorna una Funció
-- Definim una funció que retorna una funció addN :: Int -> (Int -> Int) addN n = (\x -> x + n) -- Exemple d'ús addFive :: Int -> Int addFive = addN 5 main = print (addFive 10) -- Sortida: 15
Explicació:
addN
és una funció que pren un entern
i retorna una funció que suman
a un altre enter.addFive
és una funció que suma 5 a un nombre, creada utilitzantaddN
.- Quan cridem
addFive 10
, el resultat és10 + 5
, que és15
.
Exercicis Pràctics
Exercici 1: Funció map
Implementa la funció map
, que aplica una funció a cada element d'una llista.
myMap :: (a -> b) -> [a] -> [b] myMap f [] = [] myMap f (x:xs) = f x : myMap f xs -- Exemple d'ús main = print (myMap (*2) [1, 2, 3, 4]) -- Sortida: [2, 4, 6, 8]
Exercici 2: Funció filter
Implementa la funció filter
, que selecciona els elements d'una llista que compleixen un predicat.
myFilter :: (a -> Bool) -> [a] -> [a] myFilter _ [] = [] myFilter p (x:xs) | p x = x : myFilter p xs | otherwise = myFilter p xs -- Exemple d'ús main = print (myFilter even [1, 2, 3, 4, 5, 6]) -- Sortida: [2, 4, 6]
Errors Comuns i Consells
- Oblidar el Tipus de Retorn: Quan es defineixen funcions d'ordre superior, és important especificar correctament els tipus de retorn, especialment quan es treballa amb funcions que retornen altres funcions.
- No Aplicar Correctament les Funcions: Assegura't d'aplicar les funcions als arguments correctes i en l'ordre correcte. Això és especialment important quan es treballa amb funcions que prenen altres funcions com a arguments.
Resum
En aquesta secció, hem après sobre les funcions d'ordre superior en Haskell. Hem vist com les funcions poden ser passades com a arguments i retornades com a resultats, i hem implementat exemples pràctics com applyTwice
, addN
, map
i filter
. Aquestes habilitats són fonamentals per a la programació funcional i ens permeten escriure codi més modular i reutilitzable.
En el següent tema, explorarem les Expressions Lambda, que són una manera concisa de definir funcions anònimes.