Les funcions d'ordre superior són un concepte fonamental en la programació funcional i són àmpliament utilitzades en F#. Aquestes funcions poden prendre altres funcions com a arguments i/o retornar funcions com a resultat. Això permet una gran flexibilitat i expressivitat en el codi.

Conceptes Clau

  1. Funcions com a Valors: En F#, les funcions són tractades com a valors de primera classe, el que significa que poden ser assignades a variables, passades com a arguments a altres funcions i retornades com a resultats.
  2. Funcions d'Ordre Superior: Són funcions que prenen una o més funcions com a arguments i/o retornen una funció com a resultat.

Exemples Pràctics

Exemple 1: Funció que Pren una Funció com a Argument

let applyFunction f x = f x

let square n = n * n

let result = applyFunction square 5
printfn "El resultat és: %d" result

Explicació:

  • applyFunction és una funció d'ordre superior que pren una funció f i un valor x, i aplica f a x.
  • square és una funció que calcula el quadrat d'un nombre.
  • applyFunction square 5 aplica la funció square al valor 5, resultant en 25.

Exemple 2: Funció que Retorna una Funció

let add x = 
    let innerAdd y = x + y
    innerAdd

let addFive = add 5
let result = addFive 10
printfn "El resultat és: %d" result

Explicació:

  • add és una funció que pren un valor x i retorna una funció innerAdd que suma x a un altre valor y.
  • addFive és una funció que suma 5 a qualsevol valor que se li passi.
  • addFive 10 retorna 15.

Exercicis Pràctics

Exercici 1: Filtrar una Llista

Escriu una funció d'ordre superior filter que prengui una funció de predicat i una llista, i retorni una nova llista amb els elements que compleixin el predicat.

let filter predicate lst =
    let rec loop acc = function
        | [] -> List.rev acc
        | x::xs -> if predicate x then loop (x::acc) xs else loop acc xs
    loop [] lst

// Prova la funció
let isEven n = n % 2 = 0
let numbers = [1; 2; 3; 4; 5; 6]
let evenNumbers = filter isEven numbers
printfn "Nombres parells: %A" evenNumbers

Solució:

  • filter és una funció d'ordre superior que pren un predicat predicate i una llista lst.
  • Utilitza una funció recursiva loop per iterar sobre la llista i acumular els elements que compleixen el predicat.
  • isEven és una funció que comprova si un nombre és parell.
  • filter isEven numbers retorna [2; 4; 6].

Exercici 2: Mapear una Llista

Escriu una funció d'ordre superior map que prengui una funció i una llista, i retorni una nova llista amb la funció aplicada a cada element.

let map f lst =
    let rec loop acc = function
        | [] -> List.rev acc
        | x::xs -> loop (f x :: acc) xs
    loop [] lst

// Prova la funció
let double n = n * 2
let numbers = [1; 2; 3; 4; 5]
let doubledNumbers = map double numbers
printfn "Nombres duplicats: %A" doubledNumbers

Solució:

  • map és una funció d'ordre superior que pren una funció f i una llista lst.
  • Utilitza una funció recursiva loop per iterar sobre la llista i acumular els resultats de l'aplicació de f a cada element.
  • double és una funció que duplica un nombre.
  • map double numbers retorna [2; 4; 6; 8; 10].

Errors Comuns i Consells

  1. Oblidar la Recursivitat: Quan implementis funcions com filter o map, assegura't d'utilitzar la recursivitat per iterar sobre la llista.
  2. No Utilitzar List.rev: Quan acumules resultats en una llista, és més eficient afegir elements al capdavant i després invertir la llista al final.
  3. Tipus de Funcions: Assegura't que les funcions que passes com a arguments tenen els tipus correctes per evitar errors de tipus.

Conclusió

Les funcions d'ordre superior són una eina poderosa en F# que permeten escriure codi més modular i reutilitzable. Comprendre com utilitzar-les i implementar-les és essencial per aprofitar al màxim la programació funcional en F#. En el següent tema, explorarem la recursivitat, un altre concepte clau en la programació funcional.

© Copyright 2024. Tots els drets reservats