En aquest tema, explorarem dos tipus molt importants en F#: Option i Result. Aquests tipus són fonamentals per gestionar valors que poden ser absents o operacions que poden fallar, respectivament. Aprendre a utilitzar-los correctament és essencial per escriure codi robust i segur.
Tipus Option
El tipus Option s'utilitza per representar un valor que pot o no estar present. És similar a Nullable en altres llenguatges, però més potent i segur.
Definició
El tipus Option es defineix de la següent manera:
Exemple
let divide x y =
if y = 0 then None
else Some (x / y)
let result1 = divide 10 2
let result2 = divide 10 0
match result1 with
| Some value -> printfn "Result: %d" value
| None -> printfn "Division by zero"
match result2 with
| Some value -> printfn "Result: %d" value
| None -> printfn "Division by zero"Explicació
divideés una funció que retornaSomesi la divisió és possible iNonesi no ho és.matchs'utilitza per gestionar els diferents casos deOption.
Exercici Pràctic
Escriu una funció findElement que busqui un element en una llista i retorni Some si l'element es troba i None si no.
let findElement list element =
// Implementa la funció aquí
// Prova la funció
let list = [1; 2; 3; 4; 5]
let result = findElement list 3
match result with
| Some value -> printfn "Element found: %d" value
| None -> printfn "Element not found"Solució
let findElement list element =
if List.contains element list then Some element
else None
// Prova la funció
let list = [1; 2; 3; 4; 5]
let result = findElement list 3
match result with
| Some value -> printfn "Element found: %d" value
| None -> printfn "Element not found"Tipus Result
El tipus Result s'utilitza per representar el resultat d'una operació que pot tenir èxit o fallar. És similar a Either en altres llenguatges funcionals.
Definició
El tipus Result es defineix de la següent manera:
Exemple
let parseNumber str =
match System.Int32.TryParse(str) with
| (true, number) -> Ok number
| (false, _) -> Error "Invalid number"
let result1 = parseNumber "123"
let result2 = parseNumber "abc"
match result1 with
| Ok value -> printfn "Parsed number: %d" value
| Error msg -> printfn "Error: %s" msg
match result2 with
| Ok value -> printfn "Parsed number: %d" value
| Error msg -> printfn "Error: %s" msgExplicació
parseNumberés una funció que retornaOksi la conversió és exitosa iErrorsi no ho és.matchs'utilitza per gestionar els diferents casos deResult.
Exercici Pràctic
Escriu una funció safeDivide que divideixi dos nombres i retorni Ok si la divisió és possible i Error si no.
let safeDivide x y =
// Implementa la funció aquí
// Prova la funció
let result = safeDivide 10 2
match result with
| Ok value -> printfn "Result: %d" value
| Error msg -> printfn "Error: %s" msgSolució
let safeDivide x y =
if y = 0 then Error "Division by zero"
else Ok (x / y)
// Prova la funció
let result = safeDivide 10 2
match result with
| Ok value -> printfn "Result: %d" value
| Error msg -> printfn "Error: %s" msgResum
En aquest tema, hem après sobre els tipus Option i Result en F#. Aquests tipus són essencials per gestionar valors opcionals i operacions que poden fallar, respectivament. Hem vist com definir i utilitzar aquests tipus amb exemples pràctics i exercicis.
En el següent tema, explorarem com treballar amb mapes i conjunts 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
