Optionen

Der Optionstyp wird in F# verwendet, wenn für einen benannten Wert oder eine benannte Variable möglicherweise kein tatsächlicher Wert vorhanden ist. Eine Option weist einen zugrunde liegenden Typ auf und kann einen Wert dieses Typs oder keinen Wert enthalten.

Bemerkungen

Der folgende Code veranschaulicht eine Funktion, die einen Optionstyp generiert.

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

Wie Sie sehen können, wird Some(a) generiert, wenn die Eingabe a größer als 0 ist. Andernfalls wird None generiert.

Der Wert None wird verwendet, wenn eine Option keinen tatsächlichen Wert aufweist. Andernfalls gibt der Ausdruck Some( ... ) der Option einen Wert. Die Werte Some und None sind beim Musterabgleich nützlich, wie in der folgenden Funktion exists, die true zurückgibt, wenn die Option einen Wert hat, und false, wenn dies nicht der Fall ist.

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

Using-Optionen

Optionen werden häufig verwendet, wenn eine Suche kein übereinstimmendes 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 vorstehenden Code wird eine Liste rekursiv durchsucht. Die Funktion tryFindMatch nimmt eine Prädikatfunktion pred an, die einen booleschen Wert und eine zu durchsuchende Liste zurückgibt. Wenn ein Element gefunden wird, das das Prädikat erfüllt, endet die Rekursion, und die Funktion gibt den Wert als Option im Ausdruck Some(head) zurück. Die Rekursion endet, wenn die leere Liste abgeglichen wird. An diesem Punkt wurde der Wert head nicht gefunden, und None wird zurückgegeben.

Viele F#-Bibliotheksfunktionen, die eine Auflistung nach einem Wert durchsuchen, der möglicherweise vorhanden ist oder nicht, geben den Typ option zurück. Gemäß Konvention beginnen diese Funktionen mit dem Präfix try, z. B. Seq.tryFindIndex.

Optionen können auch nützlich sein, wenn möglicherweise kein Wert vorhanden ist, z. B. wenn beim Erstellen eines Werts möglicherweise 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 Funktion openFile im vorherigen Beispiel weist den Typ string -> File option auf, da sie ein File-Objekt zurückgibt, wenn die Datei erfolgreich geöffnet wird, und None, wenn eine Ausnahme auftritt. Je nach Situation ist es möglicherweise keine sinnvolle Entwurfsentscheidung, eine Ausnahme abzufangen, statt ihre Weitergabe zuzulassen.

Darüber hinaus ist es weiterhin möglich, null oder einen Wert, der NULL ist, an den Some-Fall einer Option zu übergeben. Dies muss in der Regel vermieden werden, wie es in der F#-Programmierung auch üblich ist, es ist jedoch aufgrund der Art der Verweistypen in .NET möglich.

Optionseigenschaften und -methoden

Der Optionstyp unterstützt die folgenden Eigenschaften und Methoden.

Eigenschaft oder Methode type Beschreibung
None 'T option Ein statisches Element, das einen Optionswert erstellt, der den Wert None aufweist.
IsNone bool Gibt true zurück, wenn die Option den Wert None aufweist.
IsSome bool Gibt true zurück, wenn die Option einen Wert aufweist, der nicht None ist.
Some 'T option Ein statisches Element, das eine Option mit einem anderen Wert als None erstellt.
Wert 'T Gibt den zugrunde liegenden Wert zurück oder löst eine System.NullReferenceException aus, wenn der Wert None ist.

Optionsmodul

Es gibt das Modul Option, das nützliche Funktionen enthält, die Vorgänge für Optionen ausführen. Einige Funktionen wiederholen die Funktionalität der Eigenschaften, sind aber in Kontexten nützlich, in denen eine Funktion erforderlich ist. Option.isSome und Option.isNone sind beide Modulfunktionen, die prüfen, ob eine Option einen Wert enthält. Option.get ruft den Wert ab, sofern vorhanden. Wenn kein Wert vorhanden ist, wird System.ArgumentException ausgelöst.

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

Das Optionsmodul enthält außerdem Funktionen, die den Funktionen entsprechen, die für Listen, Arrays, Sequenzen und andere Auflistungstypen verfügbar sind. Zu diesen Funktionen gehören Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold und Option.count. Diese Funktionen ermöglichen die Verwendung von Optionen wie eine Auflistung von null oder einem Element. Weitere Informationen und Beispiele finden Sie in der Erörterung von Auflistungsfunktionen unter Listen.

Konvertieren in andere Typen

Optionen können in Listen oder Arrays konvertiert werden. Wenn eine Option in eine dieser Datenstrukturen konvertiert wird, weist die resultierende Datenstruktur null oder ein Element auf. Verwenden Sie Option.toArray, um eine Option in ein Array zu konvertieren. Verwenden Sie Option.toList, um eine Option in eine Liste zu konvertieren.

Weitere Informationen