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.tryFindIndex
napří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 None hodnota . |
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.foldBack
Option.forall
Option.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
.