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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk