Opzioni
Il tipo di opzione in F# viene usato quando un valore effettivo potrebbe non esistere per un valore o una variabile denominata. Un'opzione ha un tipo sottostante e può contenere un valore di tale tipo oppure potrebbe non avere un valore.
Osservazioni:
Il codice seguente illustra una funzione che genera un tipo di opzione.
let keepIfPositive (a: int) = if a > 0 then Some(a) else None
Come si può notare, se l'input a
è maggiore di 0, Some(a)
viene generato. In caso contrario, None
viene generato.
Il valore None
viene usato quando un'opzione non ha un valore effettivo. In caso contrario, l'espressione Some( ... )
assegna all'opzione un valore. I valori Some
e None
sono utili nei criteri di ricerca, come nella funzione exists
seguente , che restituisce true
se l'opzione ha un valore e false
, in caso contrario, .
let exists (x: int option) =
match x with
| Some(x) -> true
| None -> false
Uso delle opzioni
Le opzioni vengono comunemente usate quando una ricerca non restituisce un risultato corrispondente, come illustrato nel codice seguente.
let rec tryFindMatch pred list =
match list with
| head :: tail -> if pred (head) then Some(head) else tryFindMatch pred tail
| [] -> None
// result1 is Some 100 and its type is int option.
let result1 = tryFindMatch (fun elem -> elem = 100) [ 200; 100; 50; 25 ]
// result2 is None and its type is int option.
let result2 = tryFindMatch (fun elem -> elem = 26) [ 200; 100; 50; 25 ]
Nel codice precedente viene eseguita una ricerca ricorsiva in un elenco. La funzione accetta una funzione tryFindMatch
pred
predicato che restituisce un valore booleano e un elenco da cercare. Se viene trovato un elemento che soddisfa il predicato, la ricorsione termina e la funzione restituisce il valore come opzione nell'espressione Some(head)
. La ricorsione termina quando viene trovata una corrispondenza con l'elenco vuoto. A quel punto il valore head
non è stato trovato e None
viene restituito.
Molte funzioni della libreria F# che esesistono nella ricerca di un valore che potrebbe essere presente o meno restituiscono il option
tipo. Per convenzione, queste funzioni iniziano con il try
prefisso , Seq.tryFindIndex
ad esempio .
Le opzioni possono essere utili anche quando un valore potrebbe non esistere, ad esempio se è possibile che venga generata un'eccezione quando si tenta di costruire un valore. Questo aspetto è illustrato nell'esempio di codice seguente.
open System.IO
let openFile filename =
try
let file = File.Open(filename, FileMode.Create)
Some(file)
with ex ->
eprintf "An exception occurred with message %s" ex.Message
None
La openFile
funzione nell'esempio precedente ha un tipo string -> File option
perché restituisce un File
oggetto se il file viene aperto correttamente e None
se si verifica un'eccezione. A seconda della situazione, potrebbe non essere una scelta di progettazione appropriata per intercettare un'eccezione anziché consentire la propagazione.
Inoltre, è comunque possibile passare null
o un valore null alla combinazione di maiuscole e Some
minuscole di un'opzione. Questo è in genere da evitare e in genere si trova nella programmazione F# di routine, ma è possibile a causa della natura dei tipi di riferimento in .NET.
Proprietà e metodi delle opzioni
Il tipo di opzione supporta le proprietà e i metodi seguenti.
Proprietà o metodo | Tipo | Descrizione |
---|---|---|
None |
'T option |
Membro statico che crea un valore di opzione con il None valore . |
IsNone | bool |
Restituisce true se l'opzione ha il None valore . |
IsSome | bool |
Restituisce true se l'opzione ha un valore diverso None da . |
Some |
'T option |
Membro statico che crea un'opzione con un valore diverso da None . |
valore | 'T |
Restituisce il valore sottostante o genera un System.NullReferenceException oggetto se il valore è None . |
Modulo di opzione
È disponibile un modulo, Option, che contiene funzioni utili che eseguono operazioni sulle opzioni. Alcune funzioni ripetono la funzionalità delle proprietà, ma sono utili nei contesti in cui è necessaria una funzione. Option.isSome e Option.isNone sono entrambe funzioni del modulo che verificano se un'opzione contiene un valore. Option.get ottiene il valore, se presente. Se non è presente alcun valore, genera System.ArgumentException
.
La funzione Option.bind esegue una funzione sul valore, se è presente un valore. La funzione deve accettare esattamente un argomento e il tipo di parametro deve essere il tipo di opzione. Il valore restituito della funzione è un altro tipo di opzione.
Il modulo di opzione include anche funzioni che corrispondono alle funzioni disponibili per elenchi, matrici, sequenze e altri tipi di raccolta. Queste funzioni includono Option.map
, Option.iter
, Option.exists
Option.forall
, Option.foldBack
, , Option.fold
e Option.count
. Queste funzioni consentono di usare le opzioni come una raccolta di zero o uno elementi. Per altre informazioni ed esempi, vedere la discussione sulle funzioni di raccolta in Elenchi.
Conversione in altri tipi
Le opzioni possono essere convertite in elenchi o matrici. Quando un'opzione viene convertita in una di queste strutture di dati, la struttura di dati risultante ha zero o un elemento. Per convertire un'opzione in una matrice, usare Option.toArray
. Per convertire un'opzione in un elenco, usare Option.toList
.