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 vstup a větší než 0, Some(a) vygeneruje se. None V opačném případě se vygeneruje.

Tato hodnota None se používá, pokud možnost nemá skutečnou hodnotu. V opačném případě výraz Some( ... ) dává možnost hodnotu. Hodnoty Some a None jsou užitečné při porovnávání vzorů, 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, který se má prohledávat. 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ž se zobrazí prázdný seznam. V tomto okamžiku nebyla nalezena hodnota head a None je vrácena.

Mnoho funkcí knihovny jazyka F#, které hledají v kolekci hodnotu, která může nebo nemusí existovat, vrátí option typ. Podle konvence tyto funkce začínají předponou try , Seq.tryFindIndexnapříklad .

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 dokládá.

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í File objekt, pokud se soubor úspěšně otevře a None pokud dojde k výjimce. V závislosti na situaci nemusí být vhodným řešením návrhu zachytit výjimku, nikoli umožnit šíření.

Kromě toho je stále možné předat null nebo hodnotu, která má hodnotu null pro Some případ 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 s None hodnotou.
IsNone bool Vrátí true , pokud má možnost None hodnotu.
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 System.NullReferenceException hodnotu nebo vyvolá hodnotu, pokud je Nonehodnota .

Modul option

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 obě funkce modulu, které testují, jestli možnost obsahuje 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.foldBackOption.forallOption.exists, , Option.fold, , a Option.count. Tyto funkce umožňují použití možností, jako je kolekce nulových nebo jednoho elementu. Další informace a příklady najdete v diskuzi o funkcích kolekce v seznamech.

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. Chcete-li převést možnost na pole, použijte Option.toArray. Chcete-li převést možnost na seznam, použijte Option.toList.

Viz také