Sdílet prostřednictvím


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.folda 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ů.

Viz také