Bagikan melalui


Opsi

Jenis opsi di F# digunakan ketika nilai aktual mungkin tidak ada untuk nilai atau variabel bernama. Opsi memiliki jenis yang mendasar dan dapat memiliki nilai jenis tersebut atau mungkin ia tidak memiliki nilai.

Keterangan

Kode berikut mengilustrasikan fungsi yang menghasilkan jenis opsi.

let keepIfPositive (a: int) = if a > 0 then Some(a) else None

Seperti yang Anda lihat, jika input a lebih besar dari 0, Some(a) dihasilkan. Jika tidak, None dihasilkan.

Nilai None digunakan ketika opsi tidak memiliki nilai aktual. Jika tidak, ekspresi Some( ... ) memberi opsi nilai. Nilai Some dan None berguna dalam pencocokan pola, seperti dalam fungsi exists berikut, yang mengembalikan true jika opsi memiliki nilai dan false jika tidak.

let exists (x: int option) =
    match x with
    | Some(x) -> true
    | None -> false

Penggunaan Opsi

Opsi umumnya digunakan saat pencarian tidak mengembalikan hasil yang cocok, seperti yang ditunjukkan dalam kode berikut.

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 ]

Dalam kode sebelumnya, daftar dicari secara rekursif. Fungsi tryFindMatch ini mengambil fungsi predikat pred yang mengembalikan nilai Boolean, dan daftar untuk dicari. Jika elemen yang memenuhi predikat ditemukan, rekursi berakhir dan fungsi mengembalikan nilai sebagai opsi dalam ekspresi Some(head). Rekursi berakhir saat daftar kosong dicocokkan. Pada saat itu nilai head belum ditemukan, dan None dikembalikan.

Banyak fungsi pustaka F# yang mencari koleksi untuk nilai yang mungkin ada atau tidak ada yang mengembalikan jenis option. Berdasarkan konvensi, fungsi-fungsi ini dimulai dengan awalan try, misalnya, Seq.tryFindIndex.

Opsi juga dapat berguna ketika nilai mungkin tidak ada, misalnya jika ada kemungkinan bahwa pengecualian akan dilemparkan ketika Anda mencoba membuat nilai. Contoh kode berikut menggambarkan hal ini.

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

Fungsi openFile dalam contoh sebelumnya memiliki jenis string -> File option karena mengembalikan objek File jika file berhasil dibuka dan mengembalikan None jika terjadi pengecualian. Tergantung pada situasinya, ini mungkin bukan pilihan desain yang tepat untuk menangkap pengecualian daripada mengizinkannya untuk disebarluaskan.

Selain itu, masih dimungkinkan untuk meneruskan null atau nilai yang null ke kasus opsi Some. Ini umumnya harus dihindari, dan biasanya ada dalam pemrograman F# rutin, tetapi ini dimungkinkan karena sifat jenis referensi di .NET.

Properti dan metode Opsi

Jenis opsi mendukung properti dan metode berikut.

Properti atau metode Jenis Deskripsi
None 'T option Anggota statis yang membuat nilai opsi yang memiliki None nilai .
IsNone bool Mengembalikan true jika opsi memiliki nilai None.
IsSome bool Mengembalikan true jika opsi memiliki nilai yang bukan None.
Some 'T option Anggota statis yang membuat opsi yang memiliki nilai yang bukan None.
Nilai 'T Mengembalikan nilai yang mendasar, atau melempar System.NullReferenceException jika nilainya adalah None.

Modul Opsi

Ada modul, Opsi, yang berisi fungsi berguna untuk melakukan operasi pada opsi. Beberapa fungsi mengulangi fungsionalitas properti tetapi berguna dalam konteks saat fungsi diperlukan. Option.isSome dan Option.isNone adalah fungsi modul yang menguji apakah opsi menyimpan nilai. Option.get mendapatkan nilai, jika ada. Jika tidak ada nilai, ia akan melempar System.ArgumentException.

Fungsi Option.bind menjalankan fungsi pada nilai, jika ada nilai. Fungsi harus mengambil tepat satu argumen, dan jenis parameternya harus merupakan jenis opsi. Nilai yang dikembalikan dari fungsi adalah jenis opsi lain.

Modul opsi juga mencakup fungsi yang sesuai dengan fungsi yang tersedia untuk daftar, array, urutan, dan jenis koleksi lainnya. Fungsi-fungsi ini termasuk Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold, dan Option.count. Berbagai fungsi ini memungkinkan opsi untuk digunakan seperti koleksi elemen nol atau satu. Untuk informasi dan contoh selengkapnya, lihat diskusi fungsi koleksi di Daftar.

Mengonversi ke Jenis Lain

Opsi dapat dikonversi ke daftar atau array. Saat opsi dikonversi menjadi salah satu struktur data ini, struktur data yang dihasilkan memiliki elemen nol atau satu. Untuk mengonversi opsi menjadi array, gunakan Option.toArray. Untuk mengonversi opsi ke daftar, gunakan Option.toList.

Lihat juga