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 existsseguente , 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 tryFindMatchpred 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.tryFindIndexad 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 Noneda .
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.existsOption.forall, Option.foldBack, , Option.folde 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.

Vedi anche