F # - ตัวเลือก

optionประเภทใน F # ใช้ในการคำนวณเมื่ออาจมีหรือไม่มีค่าสำหรับตัวแปรหรือฟังก์ชัน ชนิดตัวเลือกใช้สำหรับแสดงค่าทางเลือกในการคำนวณ พวกเขาสามารถมีค่าที่เป็นไปได้สองค่า -Some(x) หรือ None.

ตัวอย่างเช่นฟังก์ชันที่ทำการหารจะส่งคืนค่าในสถานการณ์ปกติ แต่จะทำให้เกิดข้อยกเว้นในกรณีที่ตัวส่วนเป็นศูนย์ การใช้ตัวเลือกที่นี่จะช่วยระบุว่าฟังก์ชันนั้นสำเร็จหรือล้มเหลว

ตัวเลือกมีประเภทพื้นฐานและสามารถเก็บค่าของประเภทนั้นไว้ได้หรืออาจไม่มีค่า

การใช้ตัวเลือก

ให้เรานำตัวอย่างของฟังก์ชันการหาร โปรแกรมต่อไปนี้อธิบายสิ่งนี้ -

ให้เราเขียนฟังก์ชัน div และส่งอาร์กิวเมนต์สองตัวไปที่ 20 และ 5 -

let div x y = x / y
let res = div 20 5
printfn "Result: %d" res

เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

Result: 4

หากอาร์กิวเมนต์ที่สองเป็นศูนย์โปรแกรมจะแสดงข้อยกเว้น -

let div x y = x / y
let res = div 20 0
printfn "Result: %d" res

เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

Unhandled Exception:
System.DivideByZeroException: Division by zero

ในกรณีเช่นนี้เราสามารถใช้ชนิดตัวเลือกเพื่อส่งคืนค่าบางส่วน (ค่า) เมื่อการดำเนินการสำเร็จหรือไม่มีหากการดำเนินการล้มเหลว

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้ตัวเลือก -

ตัวอย่าง

let div x y =
   match y with
   | 0 -> None
   | _ -> Some(x/y)

let res : int option = div 20 4
printfn "Result: %A " res

เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

Result: Some 5

คุณสมบัติตัวเลือกและวิธีการ

ประเภทตัวเลือกรองรับคุณสมบัติและวิธีการต่อไปนี้ -

คุณสมบัติหรือวิธีการ ประเภท คำอธิบาย
ไม่มี ตัวเลือก T คุณสมบัติคงที่ที่ช่วยให้คุณสามารถสร้างค่าตัวเลือกที่มี None value.
IsNone บูล ผลตอบแทน true ถ้าตัวเลือกมี None มูลค่า.
IsSome บูล ผลตอบแทน true หากตัวเลือกมีค่าที่ไม่ใช่ None.
บาง ตัวเลือก T สมาชิกแบบคงที่ที่สร้างอ็อพชันที่มีค่าที่ไม่ใช่ None.
ค่า 'ท ส่งคืนค่าพื้นฐานหรือพ่น NullReferenceException หากค่าเป็น None.

ตัวอย่าง 1

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

let res : int option = checkPositive(-31)
printfn "Result: %A " res

เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

Result: <null>

ตัวอย่าง 2

let div x y =
   match y with
   | 0 -> None
   | _ -> Some(x/y)

let res : int option = div 20 4
printfn "Result: %A " res
printfn "Result: %A " res.Value

เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

Result: Some 5
Result: 5

ตัวอย่างที่ 3

let isHundred = function
   | Some(100) -> true
   | Some(_) | None -> false

printfn "%A" (isHundred (Some(45)))
printfn "%A" (isHundred (Some(100)))
printfn "%A" (isHundred None)

เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -

false
true
false