Seçenekler
F# içinde seçenek türü, adlandırılmış değer veya değişken için gerçek bir değer mevcut olmayabilirken kullanılır. Bir seçeneğin temel türü vardır ve bu türdeki bir değeri tutabilir veya bir değerine sahip değildir.
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 None takdirde oluşturulur.
Değer, None bir seçeneğin gerçek değeri yoksa kullanılır. Aksi takdirde ifade Some( ... ) seçeneğine bir değer verir. ve değerleri, aşağıdaki işlevde olduğu gibi, seçeneğin bir değeri varsa ve değere sahipse döndüren desen Some None exists true false eşleştirmesinde 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 eşleşen bir sonuç dönmezken 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 liste, tekrar tekrar aranır. işlevi, tryFindMatch Boole değeri ve pred aranma listesi döndüren bir önkate işlevi alır. Önkate uygun bir öğe bulunursa, recursion sona erer ve işlev, ifadesinde bir seçenek olarak değeri Some(head) döndürür. Boş liste eşlediğinde, yeniden ifade sona erer. Bu noktada değer head bulunamadı ve None döndürülür.
Bir koleksiyonda varolmayabilirsiniz veya olmayabilir bir değer için arama birçok F# kitaplık işlevi türü option döner. Kural gereği, bu işlevler ön try ekle başlar, örneğin Seq.tryFindIndex .
Seçenekler, bir değer mevcut olmayabilirken de yararlı olabilir; örneğin, bir değer oluşturmaya çalışsanız bir özel durum atılmalıdır. 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
Önceki openFile örnekteki işlevin türü vardır çünkü dosya başarıyla açılırsa ve bir özel durum string -> File option File None oluşursa bir nesnesi döndürür. Duruma bağlı olarak, yayılmasına izin verme yerine bir özel durumu yakalamak uygun bir tasarım seçimi olabilir.
Ayrıca, yine de bir seçenek null büyük/küçük harfe null olan Some bir değer geçmek mümkündür. Bu genellikle kaçınılmalıdır ve genellikle rutin F# programlamadadır, ancak .NET'te başvuru türlerinin yapısından dolayı 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 | Tür | Description |
|---|---|---|
| Hiçbiri | 'T option |
değerine sahip bir seçenek değeri oluşturmanıza olanak sağlayan statik None bir özellik. |
| IsNone | bool |
Seçeneğin true değeri varsa None döndürür. |
| IsSome | bool |
seçeneği, true değil bir değere sahipse None döndürür. |
| Bazen | 'T option |
olmayan bir değeri olan bir seçenek oluşturan statik None üye. |
| Değer | 'T |
Temel alınan değeri döndürür veya değeri ise System.NullReferenceException değerini None döndürür. |
Seçenek Modülü
Seçenekler üzerinde işlem gerçekleştirenyararlı işlevler içeren bir modül olan Seçenek vardır. Bazı işlevler özelliklerin işlevselliğini yineler, ancak bir işlevin gerekli olduğu bağlamlarda yararlıdır. Option.isSome ve Option.isNone, bir seçeneğin değere sahip olup olmadığını test etmek için modül işlevleridir. Option.get, varsa değeri elde ediyor. Değer yoksa değerini System.ArgumentException verir.
Bir değer varsa, Option.bind işlevi değer üzerinde bir işlev yürütür. İşlev tam olarak bir bağımsız değişken, parametre türü ise seçenek türü olmalıdır. İşlevin dönüş değeri, başka bir seçenek t t.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.map , , , , , ve Option.iter Option.forall Option.exists Option.foldBack Option.fold Option.count işlevleridir. Bu işlevler, seçeneklerin sıfır veya bir öğe koleksiyonu gibi kullanılmaktadır. Daha fazla bilgi ve örnekler için Listeler'de koleksiyon işlevlerinin tartışma konusuna bakın.
Diğer Türlere Dönüştürme
Seçenekler listelere veya dizilere dönüştürmek için kullanılabilir. Bir seçenek bu veri yapılarından herhangi biri haline dönüştür geldiğinde, 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 Option.toArray kullanın. Bir seçeneği listeye dönüştürmek için Option.toList kullanın.