En aquest tema, explorarem dos conceptes fonamentals en F#: les funcions i la immutabilitat. Aquests conceptes són crucials per entendre la programació funcional i com F# facilita l'escriptura de codi clar, concís i segur.
Funcions en F#
Definició de Funcions
En F#, les funcions es defineixen utilitzant la paraula clau let
. Aquí teniu un exemple bàsic:
En aquest exemple, suma
és una funció que pren dos arguments x
i y
i retorna la seva suma.
Funcions Anònimes
Les funcions anònimes (o lambdes) es poden definir utilitzant la paraula clau fun
. Aquí teniu un exemple:
Aquesta funció fa el mateix que la funció suma
, però utilitza una sintaxi diferent.
Funcions d'Ordre Superior
Les funcions d'ordre superior són funcions que poden prendre altres funcions com a arguments o retornar funcions. Aquí teniu un exemple:
En aquest exemple, aplicarDuesVegades
és una funció que pren una funció f
i un valor x
, i aplica f
a x
dues vegades.
Exercici Pràctic
Exercici: Defineix una funció doblar
que prengui un nombre i el multipliqui per 2. Després, utilitza la funció aplicarDuesVegades
per aplicar doblar
dues vegades a un nombre.
let doblar x = x * 2 let resultat = aplicarDuesVegades doblar 3 printfn "%d" resultat // Ha de mostrar 12
Solució:
let doblar x = x * 2 let aplicarDuesVegades f x = f (f x) let resultat = aplicarDuesVegades doblar 3 printfn "%d" resultat // Ha de mostrar 12
Immutabilitat
Variables Immutables
En F#, les variables definides amb let
són immutables per defecte. Això significa que no es poden canviar després de ser assignades. Aquí teniu un exemple:
Beneficis de la Immutabilitat
- Seguretat del Codi: Les variables immutables redueixen els errors perquè no es poden modificar accidentalment.
- Facilitat de Raonament: És més fàcil raonar sobre el codi quan les variables no canvien.
- Concorrència: La immutabilitat facilita la programació concurrent perquè no hi ha problemes de condicions de carrera.
Treballant amb Col·leccions Immutables
Les col·leccions en F# també són immutables per defecte. Aquí teniu un exemple amb una llista:
En aquest exemple, llista
no es modifica; en canvi, es crea una nova llista novaLlista
amb l'element afegit.
Exercici Pràctic
Exercici: Defineix una funció afegirElement
que prengui una llista i un element, i retorni una nova llista amb l'element afegit al començament.
let afegirElement element llista = element :: llista let llistaOriginal = [1; 2; 3] let novaLlista = afegirElement 0 llistaOriginal printfn "%A" novaLlista // Ha de mostrar [0; 1; 2; 3]
Solució:
let afegirElement element llista = element :: llista let llistaOriginal = [1; 2; 3] let novaLlista = afegirElement 0 llistaOriginal printfn "%A" novaLlista // Ha de mostrar [0; 1; 2; 3]
Conclusió
En aquesta secció, hem après sobre les funcions i la immutabilitat en F#. Hem vist com definir funcions, utilitzar funcions anònimes i d'ordre superior, i els beneficis de la immutabilitat. Aquests conceptes són fonamentals per a la programació funcional i ens preparen per a temes més avançats en F#.
Curs de Programació en F#
Mòdul 1: Introducció a F#
Mòdul 2: Conceptes Bàsics
- Tipus de Dades i Variables
- Funcions i Immutabilitat
- Coincidència de Patrons
- Col·leccions: Llistes, Matrius i Seqüències
Mòdul 3: Programació Funcional
Mòdul 4: Estructures de Dades Avançades
Mòdul 5: Programació Orientada a Objectes en F#
- Classes i Objectes
- Herència i Interfícies
- Barreja de Programació Funcional i Orientada a Objectes
- Mòduls i Espais de Noms
Mòdul 6: Programació Asíncrona i Paral·lela
- Fluxos de Treball Asíncrons
- Biblioteca de Tasques Paral·leles
- MailboxProcessor i Agents
- Patrons de Concurrència
Mòdul 7: Accés i Manipulació de Dades
Mòdul 8: Proves i Depuració
- Proves Unitàries amb NUnit
- Proves Basades en Propietats amb FsCheck
- Tècniques de Depuració
- Perfilat de Rendiment