Opzioni (F#)

Il tipo di opzione in F# viene utilizzato nel caso in cui potrebbe non esistere un valore effettivo per una variabile o un valore denominato. Un'opzione dispone di un tipo sottostante e può contenere un valore del tipo o non disporre di alcun valore.

Note

Nel codice seguente viene illustrato l'utilizzo del tipo opzione.

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

Il valore None viene utilizzato quando un'opzione non dispone di un valore effettivo. In caso contrario, l'espressione Some( ... ) assegna un valore all'opzione. I valori Some e None risultano utili nei criteri di ricerca, come nel caso della funzione exists seguente, che restituisce true se l'opzione presenta un valore e false in caso contrario.

let exists (x : int option) = 
    match x with
    | Some(x) -> true
    | None -> false

Utilizzo delle opzioni

Le opzioni vengono in genere utilizzate nel caso in cui una ricerca non restituisca un risultato corrispondente, come mostrato 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 tryFindMatch utilizza una funzione di predicato pred che restituisce un valore booleano e un elenco in cui eseguire una ricerca. Se non viene rilevato alcun elemento che soddisfi il predicato, la ricorsione termina e la funzione restituisce il valore come opzione nell'espressione Some(head). La ricorsione termina quando viene rilevata una corrispondenza con l'elenco vuoto. A questo punto non è stato rilevato il valore head e viene restituito None.

Molte funzioni della libreria F# che eseguono una ricerca di un valore esistente o meno in una raccolta restituiscono il tipo option. Per convenzione, queste funzioni iniziano con il prefisso try, ad esempio, Seq.tryFindIndex.

Le opzioni risultano inoltre utili 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 funzione openFile nell'esempio precedente è di tipo string -> File option, poiché restituisce un oggetto File se il file viene aperto correttamente e None se si verifica un'eccezione. A seconda della situazione, potrebbe non essere opportuno a livello di progettazione rilevare un'eccezione piuttosto che consentirne la propagazione.

Metodi e proprietà di opzioni

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

Proprietà o metodo

Type

Descrizione

Nessuno

'T option

Proprietà statica che consente di creare un valore di opzione con valore None.

IsNone

bool

Restituisce true se l'opzione presenta il valore None.

IsSome

bool

Restituisce true se l'opzione presenta un valore diverso da None.

Some

'T option

Membro statico che crea un'opzione con un valore diverso da None.

Valore

'T

Restituisce il valore sottostante oppure genera un'eccezione NullReferenceException se il valore è None.

Modulo Option

È disponibile un modulo, Option, in cui sono incluse utili funzioni che consentono di eseguire operazioni sulle opzioni. Alcune funzioni ripetono la funzionalità delle proprietà, ma risultano utili in contesti in cui è necessaria una funzione. Option.isSome e Option.isNone sono funzioni di modulo che verificano la presenza di un valore all'interno di un'opzione. Option.get ottiene il valore, se disponibile. Se non è presente alcun valore, genera un'eccezione ArgumentException.

La funzione Option.bind esegue una funzione sul valore, se disponibile. La funzione deve utilizzare un solo argomento e il relativo tipo di parametro deve essere il tipo di opzione. Il valore restituito della funzione è un altro tipo di opzione.

Il modulo di opzione include inoltre funzioni corrispondenti a quelle disponibili per elenchi, matrici, sequenze e altri tipi di raccolta. Queste funzioni includono Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold e Option.count. Queste funzioni consentono l'utilizzo delle opzioni come raccolta composta da zero o un elemento. Per ulteriori informazioni ed esempi, vedere la discussione relativa alle funzioni delle raccolte negli elenchi.

Conversione verso altri tipi

È possibile convertire le opzioni in elenchi o matrici. Quando un'opzione viene convertita in una di queste strutture di dati, la struttura risultante contiene zero o un elemento. Per convertire un'opzione in una matrice, utilizzare Option.toArray. Per convertire un'opzione in un elenco, utilizzare Option.toList.

Vedere anche

Altre risorse

Riferimenti per il linguaggio F#

Tipi F#