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 existsolduğ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 Nonebir değere sahipse döndürürtrue.
Some 'T option değeri olmayan Nonebir seçenek oluşturan statik üye.
Value 'T Temel alınan değeri döndürür veya değeri ise Nonebir 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.foldve Option.countiş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.

Ayrıca bkz.