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ófi un valorx, i aplicafdues 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 enterni retorna una funció que sumana 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.
