Seçenekler
F# içindeki seçenek türü, adlandırılmış bir değer veya değişken için gerçek bir değer mevcut olmadığında kullanılır. Bir seçenek temel alınan bir türe sahiptir ve bu türdeki bir değeri tutabilir veya değeri olmayabilir.
Açıklamalar
Aşağıdaki kod, seçenek türü oluşturan bir işlevi gösterir.
let keepIfPositive (a: int) = if a > 0 then Some(a) else None
Gördüğünüz gibi, giriş a
0'dan Some(a)
büyükse oluşturulur. Aksi takdirde oluşturulur None
.
None
Değer, bir seçeneğin gerçek değeri olmadığında kullanılır. Aksi takdirde ifade Some( ... )
seçeneğine bir değer verir. ve değerleriSome
, seçeneğin bir değeri varsa ve false
yoksa döndüren true
aşağıdaki işlevinde exists
olduğu gibi desen eşleştirmede None
yararlıdır.
let exists (x: int option) =
match x with
| Some(x) -> true
| None -> false
Seçenekleri Kullanma
Seçenekler genellikle aşağıdaki kodda gösterildiği gibi bir arama eşleşen sonuç döndürmediğinde kullanılır.
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 ]
Önceki kodda, bir listede özyinelemeli olarak arama yapılır. İşlev tryFindMatch
, Boole değeri döndüren bir koşul işlevi pred
ve aranacak bir liste alır. Koşulu karşılayan bir öğe bulunursa, özyineleme sona erer ve işlev ifadesinde Some(head)
bir seçenek olarak değeri döndürür. Özyineleme, boş liste eşleştirildiğinde sona erer. Bu noktada değer head
bulunamadı ve None
döndürülür.
Bir koleksiyonda var olabilecek veya varolmayan bir değeri arayan birçok F# kitaplık işlevi türü döndürür option
. Kural gereği, bu işlevler ön ekiyle try
başlar; örneğin, Seq.tryFindIndex
.
Seçenekler, bir değer mevcut olmadığında da yararlı olabilir; örneğin, bir değer oluşturmaya çalıştığınızda bir özel durum oluşturulabiliyorsa. Aşağıdaki kod örneği bunu gösterir.
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
openFile
Önceki örnekteki işlevin türü string -> File option
vardır çünkü dosya başarıyla açılırsa ve None
bir özel durum oluşursa bir File
nesne döndürür. Duruma bağlı olarak, bir özel durumu yakalamak için yayılmasına izin vermek yerine uygun bir tasarım seçimi olmayabilir.
Ayrıca, bir seçenek durumunda null Some
olan bir değeri geçirmek null
veya yine de mümkündür. Bu genellikle önlenmelidir ve genellikle rutin F# programlamasındadır, ancak .NET'teki başvuru türlerinin doğası nedeniyle mümkündür.
Seçenek Özellikleri ve Yöntemleri
Seçenek türü aşağıdaki özellikleri ve yöntemleri destekler.
Özellik veya yöntem | Type | Açıklama |
---|---|---|
None |
'T option |
Değeri olan bir seçenek değeri None oluşturan statik üye. |
IsNone | bool |
Seçeneğin None değeri varsa döndürürtrue . |
IsSome | bool |
Seçeneğin değeri olmayan None bir değere sahipse döndürürtrue . |
Some |
'T option |
değeri olmayan None bir seçenek oluşturan statik üye. |
Value | 'T |
Temel alınan değeri döndürür veya değeri ise None bir System.NullReferenceException oluşturur. |
Seçenek Modülü
Seçenekler üzerinde işlem gerçekleştiren kullanışlı işlevler içeren Option adlı bir modül vardır. Bazı işlevler özelliklerin işlevselliğini yineler, ancak bir işlevin gerekli olduğu bağlamlarda kullanışlıdır. Option.isSome ve Option.isNone , bir seçeneğin değer barındırıp tutmadığını test eden modül işlevleridir. Option.get , varsa değeri alır. Değer yoksa, oluşturur System.ArgumentException
.
Option.bind işlevi, bir değer varsa, değer üzerinde bir işlev yürütür. İşlev tam olarak bir bağımsız değişken almalı ve parametre türü seçenek türü olmalıdır. İşlevin dönüş değeri başka bir seçenek türüdür.
Seçenek modülü listeler, diziler, diziler ve diğer koleksiyon türleri için kullanılabilen işlevlere karşılık gelen işlevleri de içerir. Bu işlevler , , Option.iter
, Option.forall
, Option.exists
, Option.foldBack
, Option.fold
ve Option.count
işlevleridirOption.map
. Bu işlevler, seçeneklerin sıfır veya bir öğe koleksiyonu gibi kullanılmasını sağlar. Daha fazla bilgi ve örnek için Listeler'de koleksiyon işlevlerinin tartışmasını inceleyin.
Diğer Türlere Dönüştürme
Seçenekler listelere veya dizilere dönüştürülebilir. Bir seçenek bu veri yapılarından birine dönüştürüldüğünde, sonuçta elde edilen veri yapısı sıfır veya bir öğeye sahiptir. Bir seçeneği diziye dönüştürmek için kullanın Option.toArray
. Bir seçeneği listeye dönüştürmek için kullanın Option.toList
.