F # - Opcje
Plik optionTyp w F # jest używany w obliczeniach, gdy może istnieć wartość zmiennej lub funkcji lub nie. Typy opcji służą do reprezentowania opcjonalnych wartości w obliczeniach. Mogą mieć dwie możliwe wartości -Some(x) lub None.
Na przykład funkcja wykonująca dzielenie zwróci wartość w normalnej sytuacji, ale zgłosi wyjątki w przypadku zerowego mianownika. Korzystanie z opcji w tym miejscu pomoże wskazać, czy funkcja się powiodła, czy nie.
Opcja ma typ bazowy i może zawierać wartość tego typu lub może nie mieć wartości.
Korzystanie z opcji
Weźmy przykład funkcji dzielenia. Poniższy program wyjaśnia to -
Napiszmy funkcję div i prześlijmy do niej dwa argumenty 20 i 5 -
let div x y = x / y
let res = div 20 5
printfn "Result: %d" res
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Result: 4
Jeśli drugi argument ma wartość zero, program zgłasza wyjątek -
let div x y = x / y
let res = div 20 0
printfn "Result: %d" res
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Unhandled Exception:
System.DivideByZeroException: Division by zero
W takich przypadkach możemy użyć typów opcji, aby zwrócić Some (value), gdy operacja się powiedzie lub None, jeśli operacja się nie powiedzie.
Poniższy przykład demonstruje użycie opcji -
Przykład
let div x y =
match y with
| 0 -> None
| _ -> Some(x/y)
let res : int option = div 20 4
printfn "Result: %A " res
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Result: Some 5
Właściwości opcji i metody
Typ opcji obsługuje następujące właściwości i metody -
Właściwość lub metoda | Rodzaj | Opis |
---|---|---|
Żaden | Opcja „T” | Właściwość statyczna, która umożliwia utworzenie wartości opcji z rozszerzeniem None value. |
IsNone | bool | Zwroty true jeśli opcja ma rozszerzenie None wartość. |
IsSome | bool | Zwroty true jeśli opcja ma wartość, która nie jest None. |
Trochę | Opcja „T” | Statyczny element członkowski, który tworzy opcję, która ma wartość, która nie jest None. |
Wartość | „T | Zwraca wartość bazową lub zgłasza NullReferenceException, jeśli wartość to None. |
Przykład 1
let checkPositive (a : int) =
if a > 0 then
Some(a)
else
None
let res : int option = checkPositive(-31)
printfn "Result: %A " res
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Result: <null>
Przykład 2
let div x y =
match y with
| 0 -> None
| _ -> Some(x/y)
let res : int option = div 20 4
printfn "Result: %A " res
printfn "Result: %A " res.Value
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Result: Some 5
Result: 5
Przykład 3
let isHundred = function
| Some(100) -> true
| Some(_) | None -> false
printfn "%A" (isHundred (Some(45)))
printfn "%A" (isHundred (Some(100)))
printfn "%A" (isHundred None)
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
false
true
false