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.