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