Optionen (F#)

Der Optionstyp in F# wird verwendet, wenn ein tatsächlicher Wert für einen benannten Wert oder eine Variable möglicherweise nicht vorhanden ist.Eine Option verfügt über einen zugrunde liegenden Typ und kann möglicherweise einen Wert dieses Typs bzw. keinen Wert aufweisen.

Hinweise

Folgender Code veranschaulicht die Verwendung des Optionstyps.

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

Der Wert None wird verwendet, wenn eine Option über keinen tatsächlichen Wert verfügt.Andernfalls erhält die Option mit dem Ausdruck Some( ... ) einen Wert.Die Werte Some und None sind beim Mustervergleich hilfreich, z. B. in der folgenden Funktion exists, die true zurückgibt, wenn die Option über einen Wert verfügt, und false, wenn sie über keinen Wert verfügt.

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

Verwenden von Optionen

Optionen werden häufig verwendet, wenn eine Suche kein entsprechendes Ergebnis zurückgibt, wie im folgenden Code gezeigt.

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 ]

Im vorangehenden Code wird eine Liste rekursiv durchsucht.Die tryFindMatch-Funktion akzeptiert eine pred-Prädikatfunktion, die einen booleschen Wert und eine Suchliste zurückgibt.Wird ein Element gefunden, das die Anforderungen für das Finden des Prädikats erfüllt, wird die Rekursion beendet, und die Funktion gibt den übereinstimmenden Wert als Option im Ausdruck Some(head) zurück.Die Rekursion endet, wenn die leere Liste übereinstimmt.An diesem Punkt wurde der head-Wert nicht gefunden, und None wird zurückgegeben.

Viele F#-Bibliotheksfunktionen zum Suchen nach einem Wert in einer Auflistung, der möglicherweise vorhanden ist, geben den option-Typ zurück.Konventionell beginnen diese Funktionen mit dem try-Präfix, z. B. Seq.tryFindIndex.

Eine Option kann auch hilfreich sein, wenn ein Wert möglicherweise nicht vorhanden ist, z. B. wenn es möglich ist, dass beim Erstellen eines Werts eine Ausnahme ausgelöst wird.Dies wird im folgenden Codebeispiel veranschaulicht.

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    

Die openFile-Funktion im vorangehenden Beispiel ist vom Typ string -> File option, da sie ein File-Objekt zurückgibt, wenn die Datei erfolgreich geöffnet wird, oder None, wenn eine Ausnahme auftritt.Abhängig von der Situation empfiehlt es sich möglicherweise nicht, das Design so zu gestalten, dass eine Ausnahme abgefangen, statt weitergegeben wird.

Optionseigenschaften und -methoden

Der Optionstyp unterstützt die folgenden Eigenschaften und Methoden.

Eigenschaft oder Methode

Typ

Beschreibung

None

'T option

Eine statische Eigenschaft, die Ihnen ermöglicht, einen Optionswert zu erstellen, der den None-Wert aufweist.

IsNone

bool

Gibt true zurück, wenn die Option über den None-Wert verfügt.

IsSome

bool

Gibt true zurück, wenn die Option über einen Wert verfügt, der nicht None ist.

Some

'T option

Ein statischer Member, der eine Option mit einem Wert erstellt, der nicht None ist.

Wert

'T

Gibt den zugrunde liegenden Wert zurück, oder löst eine NullReferenceException-Ausnahme aus, wenn der Wert None ist.

Option-Modul

Das Modul Option, das nützliche Funktionen enthält, die Operationen auf Optionen ausführen.Einige Funktionen wiederholen die Funktionalität der Eigenschaften, sind aber in Kontexten nützlich, in denen eine Funktion benötigt wird.Option.isSome und Option.isNone sind Modulfunktionen, mit denen getestet wird, ob eine Option einen Wert enthält.Option.get ruft den Wert ab, sollte keiner vorhanden sein.Ist kein Wert vorhanden, wird ArgumentException ausgelöst.

Die Option.bind-Funktion führt eine Funktion für den Wert aus, wenn ein Wert vorhanden ist.Die Funktion muss genau ein Argument akzeptieren, und sein Parametertyp muss der Optionstyp sein.Der Rückgabewert der Funktion ist ein anderer Optionstyp.

Das Optionsmodul enthält auch Funktionen, die den Funktionen entsprechen, die für Listen, Arrays, Sequenzen und andere Auflistungstypen verfügbar sind.Diese Funktionen enthalten Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold und Option.count.Durch diese Funktionen können Optionen wie eine Auflistung mit 0 (null) oder einem Element verwendet werden.Weitere Informationen und Beispiele finden Sie in der Abhandlung zu Auflistungsfunktionen unter Listen.

Konvertieren in andere Typen

Optionen können in Listen oder Arrays konvertiert werden.Wird eine Option in eine dieser Datenstrukturen konvertiert, verfügt die resultierende Datenstruktur über 0 (null) oder ein Element.Zum Konvertieren einer Option in ein Array verwenden Sie Option.toArray.Zum Konvertieren einer Option in eine Liste verwenden Sie Option.toList.

Siehe auch

Weitere Ressourcen

F#-Sprachreferenz

F#-Typen