Beállítások
Az F# beállítástípust akkor használja a rendszer, ha egy névvel ellátott értékhez vagy változóhoz nem létezik tényleges érték. Egy beállítás mögöttes típussal rendelkezik, és tartalmazhat egy ilyen típusú értéket, vagy lehet, hogy nem rendelkezik értékkel.
Megjegyzések
Az alábbi kód egy olyan függvényt mutat be, amely egy beállítástípust hoz létre.
let keepIfPositive (a: int) = if a > 0 then Some(a) else None
Amint látható, ha a bemenet a
nagyobb, mint 0, Some(a)
létrejön. None
Ellenkező esetben létre lesz hozva.
Az érték None
akkor használatos, ha egy beállítás nem rendelkezik tényleges értékkel. Ellenkező esetben a kifejezés Some( ... )
értéket ad a lehetőségnek. Az értékek Some
és None
a mintaegyeztetés szempontjából hasznosak, mint az alábbi függvényben exists
, amely azt adja vissza true
, hogy a beállítás rendelkezik-e értékkel, és false
ha nem.
let exists (x: int option) =
match x with
| Some(x) -> true
| None -> false
A beállítások használata
A beállításokat gyakran használják, ha a keresés nem ad vissza egyező eredményt, ahogy az az alábbi kódban is látható.
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 ]
Az előző kódban a rendszer rekurzív módon keres egy listát. A függvény tryFindMatch
egy predikátumfüggvényt pred
vesz fel, amely logikai értéket ad vissza, és egy listát keres. Ha egy olyan elem található, amely megfelel a predikátumnak, a rekurzió véget ér, és a függvény az értéket a kifejezésben Some(head)
lehetőségként adja vissza. A rekurzió az üres lista egyeztetésével ér véget. Ekkor az érték head
nem található, és None
a rendszer visszaadja.
Számos F#-kódtárfüggvény, amely egy gyűjteményben keres egy olyan értéket, amely lehet, hogy létezik, vagy nem létezik, a típust option
adja vissza. Konvenció szerint ezek a függvények például az try
előtaggal kezdődnek Seq.tryFindIndex
.
A beállítások akkor is hasznosak lehetnek, ha egy érték nem létezik, például ha lehetséges, hogy kivétel jelenik meg egy érték létrehozásakor. Az alábbi példakód ezt szemlélteti.
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
Az openFile
előző példában szereplő függvény típusa string -> File option
azért van, mert egy File
objektumot ad vissza, ha a fájl sikeresen megnyílik, és None
kivétel történik. A helyzettől függően előfordulhat, hogy nem megfelelő kialakítási választás, ha kivételt észlel ahelyett, hogy lehetővé tenné a propagálást.
Emellett továbbra is átadható null
, vagy egy lehetőség esetében null Some
értékű érték. Ezt általában kerülni kell, és általában rutin F# programozásban van, de a .NET-ben a referenciatípusok jellege miatt lehetséges.
Beállítás tulajdonságai és metódusai
A beállítástípus a következő tulajdonságokat és metódusokat támogatja.
Tulajdonság vagy metódus | Típus | Leírás |
---|---|---|
None |
'T option |
Egy statikus tag, amely létrehoz egy olyan beállításértéket, amely rendelkezik az None értékkel. |
IsNone | bool |
Visszaadja true , ha a beállítás értéke van None . |
IsSome | bool |
Akkor adja true vissza, ha a beállítás értéke nem None . |
Some |
'T option |
Statikus tag, amely olyan beállítást hoz létre, amelynek értéke nem None . |
Érték | 'T |
A mögöttes értéket adja vissza, vagy ad egy System.NullReferenceException értéket, ha az érték .None |
Beállításmodul
Létezik egy option modul, amely hasznos függvényeket tartalmaz, amelyek műveleteket hajtanak végre a beállításokon. Egyes függvények megismétlik a tulajdonságok funkcióit, de olyan környezetekben hasznosak, ahol szükség van egy függvényre. Az Option.isSome és az Option.isNone egyaránt olyan modulfüggvény, amely ellenőrzi, hogy egy beállítás tartalmaz-e értéket. Az Option.get lekéri az értéket, ha van ilyen. Ha nincs érték, akkor dob System.ArgumentException
.
Az Option.bind függvény egy függvényt hajt végre az értéken, ha van érték. A függvénynek pontosan egy argumentumot kell tartalmaznia, a paramétertípusnak pedig a beállítástípusnak kell lennie. A függvény visszatérési értéke egy másik beállítástípus.
A beállításmodul olyan függvényeket is tartalmaz, amelyek a listákhoz, tömbökhöz, sorozatokhoz és más gyűjteménytípusokhoz elérhető függvényeknek felelnek meg. Ezek a függvények a következők: Option.map
, Option.iter
, Option.forall
, Option.exists
, Option.foldBack
Option.fold
és Option.count
. Ezek a függvények lehetővé teszik a lehetőségek használatát, például egy nulla vagy egy elemből álló gyűjteményt. További információkért és példákért tekintse meg a listák gyűjteményfüggvényeinek ismertetését.
Átalakítás más típusokká
A beállítások listákká vagy tömbökké alakíthatók. Ha egy lehetőség ezen adatstruktúrák bármelyikére konvertálódik, az eredményül kapott adatstruktúra nulla vagy egy elemből áll. Ha tömbté szeretne konvertálni egy beállítást, használja Option.toArray
a következőt: . Ha egy beállítást listává szeretne alakítani, használja Option.toList
a következőt: .