F# - 可選項



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

在這種情況下,我們可以使用可選項型別,在操作成功時返回 Some (value),在操作失敗時返回 None。

以下示例演示了可選項的使用:

示例

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

可選項屬性和方法

可選項型別支援以下屬性和方法:

屬性或方法 型別 描述
None 'T option 一個靜態屬性,使您可以建立一個具有None 值的可選項值。
IsNone bool 如果可選項具有None值,則返回true
IsSome bool 如果可選項的值不是None,則返回true
Some 'T option 一個靜態成員,建立一個具有非None值的可選項。
Value 'T 返回底層值,如果值為None,則丟擲 NullReferenceException。

示例 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
廣告
© . All rights reserved.