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