Opcje (F#)
Typ opcji F# jest używany, gdy rzeczywista wartość może nie istnieć dla nazwanej wartości lub zmiennej.Opcja ma podstawowy typ i może zawierać wartości tego typu lub nie może mieć wartość.
Uwagi
Poniższy kod ilustruje użycie typu opcji.
let keepIfPositive (a : int) = if a > 0 then Some(a) else None
Wartość None jest używana, gdy opcja nie ma rzeczywistej wartości.W przeciwnym wypadku wyrażenie Some( ... ) daje możliwość wartość.Wartości Some i None służą do porównywania wzorców, jak w następującej funkcji exists, które zwraca true , jeśli opcja ma wartość i false , jeśli nie ma.
let exists (x : int option) =
match x with
| Some(x) -> true
| None -> false
Korzystając z opcji
Opcje są często używane podczas wyszukiwania nie zwraca pasujący wynik, jak pokazano w poniższym kodzie.
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 ]
W poprzednim kodzie lista jest wyszukiwany rekursywnie.Funkcja tryFindMatch przyjmuje predykatu funkcji pred , zwraca wartość logiczną i listę wyszukiwania.Jeśli zostanie znaleziony element, który spełnia predykat, końce rekursji, a funkcja zwraca wartość jako opcja w wyrażeniu Some(head).Rekursja kończy się, gdy jest dopasowywane pustą listę.W tym punkcie wartość head nie został znaleziony, i None jest zwracany.
Wiele F# biblioteka funkcji, które przeszukiwania zbioru wartości, które mogą lub nie mogą istnieć zwrotu option typu.Umownie, te funkcje rozpoczyna się od try prefiksu, na przykład, Seq.tryFindIndex.
Opcje można także przydatna, gdy wartość może nie istnieć, na przykład, jeśli jest to możliwe, że będzie się wyjątek podczas próby konstruowania wartości.Poniższy przykład kodu ilustruje to.
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
openFile Funkcji w poprzednim przykładzie ma typ string -> File option , ponieważ zwraca File obiektu, jeśli plik zostanie otwarty pomyślnie i None , jeśli wystąpi wyjątek.W zależności od sytuacji nie może być wybór odpowiednich projektów do połowu wyjątek, a nie zezwalając na propagowanie.
Opcja właściwości i metody
Typ opcji obsługuje następujące metody i właściwości.
Właściwość lub metoda |
Typ |
Opis |
---|---|---|
'T option |
Właściwość statyczna, umożliwiający tworzenie wartości opcji, która ma None wartości. |
|
bool |
Zwraca true , jeśli opcja ma None wartości. |
|
bool |
Zwraca true , jeśli opcja ma wartość, która nie jest None. |
|
'T option |
Członka statycznego, która tworzy opcja ma wartość, która nie jest None. |
|
'T |
Zwraca wartości podstawowej lub wyrzuca NullReferenceException , jeśli wartość jest None. |
Opcja modułu
Moduł jest opcji, który zawiera przydatne funkcje, które wykonują operacje na opcje.Niektóre funkcje Powtórz funkcji właściwości, ale są przydatne w kontekstach, gdy jest potrzebna funkcja.Option.isSome i Option.isNone są obie funkcje modułu, które sprawdzić, czy opcja przechowuje wartość.Option.Get uzyska wartość, jeśli istnieje.Jeśli nie ma żadnej wartości, wyrzuca ArgumentException.
Option.bind funkcja wykonuje funkcję na wartość, jeśli istnieje wartość.Funkcja musi mieć dokładnie jeden argument, a jego typ parametru musi być typu opcji.Wartość zwracana funkcji jest innego typu opcji.
Moduł opcja obejmuje również funkcje, które odpowiadają funkcje, które są dostępne dla listy, tablice, sekwencje i inne typy kolekcji.Te funkcje obejmują Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold, i Option.count.Te funkcje Włącz opcje, aby używać tak, jak zbiór zero lub jeden elementów.Aby uzyskać więcej informacji i przykładów można znaleźć w omówieniu funkcji zbierania w zawiera listę.
Konwertowanie na inne typy
Opcje mogą być konwertowane do list lub tablic.Gdy opcja jest konwertowany na jeden z tych struktur danych, struktura danych zawiera zero lub jeden element.Aby przekonwertować opcję do tablicy, należy użyć Option.toArray.Aby przekonwertować opcji do listy, użyj Option.toList.