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:

type Option<'T> =
    | Some of 'T
    | None

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 retorna Some si la divisió és possible i None si no ho és.
  • match s'utilitza per gestionar els diferents casos de Option.

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:

type Result<'T, 'Error> =
    | Ok of 'T
    | Error of 'Error

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" msg

Explicació

  • parseNumber és una funció que retorna Ok si la conversió és exitosa i Error si no ho és.
  • match s'utilitza per gestionar els diferents casos de Result.

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" msg

Solució

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" msg

Resum

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#.

© Copyright 2024. Tots els drets reservats