F # - Opzioni

Il optionil tipo in F # viene utilizzato nei calcoli quando può o non può esistere un valore per una variabile o una funzione. I tipi di opzione vengono utilizzati per rappresentare valori facoltativi nei calcoli. Possono avere due possibili valori:Some(x) o None.

Ad esempio, una funzione che esegue una divisione restituirà un valore in una situazione normale, ma genererà eccezioni in caso di denominatore zero. L'utilizzo delle opzioni qui aiuterà a indicare se la funzione è riuscita o meno.

Un'opzione ha un tipo sottostante e può contenere un valore di quel tipo oppure potrebbe non avere un valore.

Utilizzo delle opzioni

Prendiamo l'esempio della funzione di divisione. Il seguente programma spiega questo:

Scriviamo una funzione div e inviamo due argomenti 20 e 5 -

let div x y = x / y
let res = div 20 5
printfn "Result: %d" res

Quando compili ed esegui il programma, restituisce il seguente output:

Result: 4

Se il secondo argomento è zero, il programma genera un'eccezione -

let div x y = x / y
let res = div 20 0
printfn "Result: %d" res

Quando compili ed esegui il programma, restituisce il seguente output:

Unhandled Exception:
System.DivideByZeroException: Division by zero

In questi casi, possiamo utilizzare i tipi di opzione per restituire Some (value) quando l'operazione ha esito positivo o None se l'operazione non riesce.

Il seguente esempio dimostra l'uso delle opzioni:

Esempio

let div x y =
   match y with
   | 0 -> None
   | _ -> Some(x/y)

let res : int option = div 20 4
printfn "Result: %A " res

Quando compili ed esegui il programma, restituisce il seguente output:

Result: Some 5

Proprietà e metodi delle opzioni

Il tipo di opzione supporta le seguenti proprietà e metodi:

Proprietà o metodo genere Descrizione
Nessuna Opzione 'T Una proprietà statica che consente di creare un valore di opzione con estensione None value.
Non è nessuno bool ritorna true se l'opzione ha l'estensione None valore.
IsSome bool ritorna true se l'opzione ha un valore che non lo è None.
Alcuni Opzione 'T Un membro statico che crea un'opzione che ha un valore diverso da quello None.
Valore 'T Restituisce il valore sottostante o genera un'eccezione NullReferenceException se il valore è None.

Esempio 1

let checkPositive (a : int) =
   if a > 0 then
      Some(a)
   else
      None

let res : int option = checkPositive(-31)
printfn "Result: %A " res

Quando compili ed esegui il programma, restituisce il seguente output:

Result: <null>

Esempio 2

let div x y =
   match y with
   | 0 -> None
   | _ -> Some(x/y)

let res : int option = div 20 4
printfn "Result: %A " res
printfn "Result: %A " res.Value

Quando compili ed esegui il programma, restituisce il seguente output:

Result: Some 5
Result: 5

Esempio 3

let isHundred = function
   | Some(100) -> true
   | Some(_) | None -> false

printfn "%A" (isHundred (Some(45)))
printfn "%A" (isHundred (Some(100)))
printfn "%A" (isHundred None)

Quando compili ed esegui il programma, restituisce il seguente output:

false
true
false