Možnosti
Typ možnosti v jazyce F# se používá, pokud skutečná hodnota pro pojmenovanou hodnotu nebo proměnnou neexistuje. Možnost má základní typ a může obsahovat hodnotu tohoto typu nebo nemusí mít hodnotu.
Poznámky
Následující kód znázorňuje funkci, která generuje typ možnosti.
let keepIfPositive (a: int) = if a > 0 then Some(a) else None
Jak vidíte, pokud je vstupní a
větší než 0, Some(a)
se vygeneruje. V opačném případě se vygeneruje None
.
Hodnota None
se používá, pokud možnost nemá skutečnou hodnotu. V opačném případě výraz Some( ... )
přiřazuje možnosti hodnotu. Hodnoty Some
a None
jsou užitečné při porovnávání vzorů, stejně jako v následující funkci exists
, která vrátí true
, pokud má možnost hodnotu a false
pokud ne.
let exists (x: int option) =
match x with
| Some(x) -> true
| None -> false
Použití možností
Možnosti se běžně používají, když hledání nevrací odpovídající výsledek, jak je znázorněno v následujícím kódu.
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 ]
V předchozím kódu se seznam prohledá rekurzivně. Funkce tryFindMatch
přebírá predikátovou funkci pred
, která vrací logickou hodnotu a seznam pro vyhledávání. Pokud je nalezen prvek, který splňuje predikát, rekurze skončí a funkce vrátí hodnotu jako možnost ve výrazu Some(head)
. Rekurze skončí, když je prázdný seznam rozpoznán. V tomto okamžiku nebyla nalezena hodnota head
a vrátí se None
.
Mnoho funkcí knihovny jazyka F#, které hledají v kolekci hodnotu, která může nebo nemusí existovat, vrací typ option
. Podle konvence začínají tyto funkce předponou try
, například Seq.tryFindIndex
.
Možnosti můžou být užitečné také v případě, že hodnota neexistuje, například pokud je možné, že se při pokusu o vytvoření hodnoty vyvolá výjimka. Následující příklad kódu to ilustruje.
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
Funkce openFile
v předchozím příkladu má typ string -> File option
, protože vrátí objekt File
, pokud se soubor úspěšně otevře a None
pokud dojde k výjimce. V závislosti na situaci nemusí být vhodnou volbou návrhu zachytit výjimku, nikoli umožnit šíření.
Kromě toho je stále možné předat null
nebo hodnotu, která je null, k případu Some
možnosti. Obvykle se tomu vyhýbáme a obvykle se jedná o běžné programování v jazyce F#, ale je to možné z důvodu povahy referenčních typů v .NET.
Option – vlastnosti a metody
Typ možnosti podporuje následující vlastnosti a metody.
Vlastnost nebo metoda | Typ | Popis |
---|---|---|
None |
'T option |
Statický člen, který vytvoří hodnotu možnosti, která má hodnotu None . |
IsNone | bool |
Vrátí true , pokud má možnost hodnotu None . |
IsSome | bool |
Vrátí true , pokud má možnost hodnotu, která není None . |
Some |
'T option |
Statický člen, který vytvoří možnost, která má hodnotu, která není None . |
hodnota | 'T |
Vrátí podkladovou hodnotu nebo vyvolá System.NullReferenceException , pokud je hodnota None . |
Volitelný modul
Existuje modul, Option, který obsahuje užitečné funkce, které provádějí operace s možnostmi. Některé funkce opakují funkce vlastností, ale jsou užitečné v kontextech, kde je funkce potřebná.
Option.isSome a Option.isNone jsou funkce modulu, které testují, jestli má možnost hodnotu.
Option.get získá hodnotu, pokud existuje. Pokud neexistuje žádná hodnota, vyvolá System.ArgumentException
.
Funkce Option.bind spustí funkci na hodnotě, pokud existuje hodnota. Funkce musí mít přesně jeden argument a jeho typ parametru musí být typ možnosti. Návratová hodnota funkce je dalším typem možnosti.
Modul option také obsahuje funkce, které odpovídají funkcím dostupným pro seznamy, pole, sekvence a další typy kolekcí. Mezi tyto funkce patří Option.map
, Option.iter
, Option.forall
, Option.exists
, Option.foldBack
, Option.fold
a Option.count
. Tyto funkce umožňují použití možností jako kolekce s nulovým nebo jedním prvkem. Další informace a příklady naleznete v diskusi o funkcích kolekce v Seznamy.
Převod na jiné typy
Možnosti lze převést na seznamy nebo pole. Pokud je možnost převedena na některou z těchto datových struktur, výsledná datová struktura má nula nebo jeden prvek. Pokud chcete převést možnost na pole, použijte Option.toArray
. Pokud chcete převést možnost na seznam, použijte Option.toList
.
Převod možností s výchozími hodnotami
Kromě převodu na seznamy a pole lze možnosti převést na jiné typy zadáním výchozích hodnot pomocí funkce Option.defaultValue
. To je zvlášť užitečné, pokud chcete zajistit, aby hodnota nebyla None
. Například:
let optionString = Some("F#")
let defaultString = optionString |> Option.defaultValue ""
// defaultString is "F#"
let optionInt = None
let defaultInt = optionInt |> Option.defaultValue 0
// defaultInt is 0
Funkce Option.defaultValue
umožňuje bezproblémově zpracovávat Some
i None
případy bez porovnávání vzorů.