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

  1. 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.
  2. 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 valor x, i aplica f dues vegades a x.
  • double és una funció que duplica un nombre.
  • Quan cridem applyTwice double 3, el resultat és double (double 3), que és 12.

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 enter n i retorna una funció que suma n a un altre enter.
  • addFive és una funció que suma 5 a un nombre, creada utilitzant addN.
  • Quan cridem addFive 10, el resultat és 10 + 5, que és 15.

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

  1. 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.
  2. 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.

© Copyright 2024. Tots els drets reservats