Ich habe also das Expert F # Buch von Apress gelesen und es hauptsächlich als Referenz beim Aufbau einer Spielzeug-F # Bibliothek verwendet, aber es gibt eine Sache, die ich nicht verstanden habe, und das ist der "Option" -Typ / p>
Wie funktioniert es und was ist es in der realen Welt?
Der Optionstyp ist mindestens ähnlich zu Nullable<T>
und Referenztypen in C #. Ein Wert vom Typ Option<T>
ist entweder None
, was bedeutet, dass es keinen eingekapselten Wert gibt, oder Some
mit einem bestimmten Wert von T
. Das ist genauso wie die Nullable<int>
in C # ist entweder der Nullwert, oder hat eine assoziierte int
- und die Art, wie ein String
Wert in C # ist entweder eine Nullreferenz, oder verweist auf ein String-Objekt.
Wenn Sie einen Optionswert verwenden, geben Sie im Allgemeinen zwei Pfade an - einen für den Fall, dass für einen verknüpften Wert steht und einen für den Fall, dass nicht ist. Mit anderen Worten, dieser Code:
%Vor%ist ähnlich wie:
%Vor%Ich glaube, die allgemeine Idee ist, dass erzwingen Sie (na ja, fast), um den "no associated value / object" -Fall zu behandeln, macht Ihren Code robuster.
Es wird verwendet, wenn eine Funktion oder Methode "vielleicht" oder "optional" einen Wert zurückgeben soll. In C # würden Sie wahrscheinlich null zurückgeben oder ein Null-Objekt oder möglicherweise Nullable für Werttypen zurückgeben.
Der Nachteil beim Zurückgeben von null (der häufigste Fall) ist, dass es nicht typsicher ist: null ist eine Instanz aller Typen, so dass Sie später in alle Arten von haarigen Nullbezugssituationen geraten.
Der Optionstyp ist ein sogenannter dislimierter Unionstyp mit zwei Konstruktoren: None und Some a. None gibt explizit an, dass Sie keinen Wert haben. Grundsätzlich ist das Null-Objekt-Muster verallgemeinert.
Um den anderen Antworten hinzuzufügen, ist der Optionstyp nichts besonderes - es ist nur eine weitere diskriminierte Vereinigung. Sie könnten es selbst in einer Zeile definieren:
%Vor%Das Dienstprogramm ist, wie andere darauf hingewiesen haben, mit dem Mustervergleich sicher dekonstruieren, anstatt nach Null zu suchen oder einen Hack-Workaround zu verwenden, um anzuzeigen, ob ein Wert nicht wirklich ein Wert ist.
Ein funktionales Muster, das den Optionstyp verwendet:
Wenn Sie Teile einer rekursiven Datenstruktur ändern müssen, z. B. einen Baum oder eine Liste, Sie werden so viel wie möglich von der vorhandenen Datenstruktur wiederverwenden wollen. Der Optionstyp kann dir dabei helfen. Diese beiden Funktionen ersetzen alle Vorkommen der Zahl 5 durch 7, aber der erste kopiert den gesamten Baum. Die zweite nicht.
%Vor%Es ist vielleicht nicht in allen Fällen notwendig, aber es ist eine nette Technik zu wissen.