值選項
當以下兩種情況成立時,會使用 F# 中的 Value Option 類型:
- 情況適用於 F# Option。
- 使用 struct 可以在您的情況中提供效能優勢。
並非所有效能敏感的情況都可以透過使用 struct 來「解決」。 在使用它們而不是參考類型時,您必須考慮複製的額外成本。 但是,大型 F# 程式通常會具現化許多流經最忙碌路徑的選用類型,在這種情況下,struct 通常會在程式的存留期內產生更佳的整體效能。
定義
Value Option 可定義為類似於參考選項類型的結構區分聯集。 其定義可以這樣想:
[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
| ValueNone
| ValueSome of 'T
Value Option 符合結構相等和比較。 主要差異在於編譯的名稱、類型名稱和大小寫名稱全都指出它是一個值類型。
使用 Value Option
Value Option 的用法就像 Options 一樣。 ValueSome
用來表示值存在,而 ValueNone
會在值不存在時使用:
let tryParseDateTime (s: string) =
match System.DateTime.TryParse(s) with
| (true, dt) -> ValueSome dt
| (false, _) -> ValueNone
let possibleDateString1 = "1990-12-25"
let possibleDateString2 = "This is not a date"
let result1 = tryParseDateTime possibleDateString1
let result2 = tryParseDateTime possibleDateString2
match (result1, result2) with
| ValueSome d1, ValueSome d2 -> printfn "Both are dates!"
| ValueSome d1, ValueNone -> printfn "Only the first is a date!"
| ValueNone, ValueSome d2 -> printfn "Only the second is a date!"
| ValueNone, ValueNone -> printfn "None of them are dates!"
與 Options 一樣,傳回 ValueOption
的函式的命名慣例是在其前面加上 try
。
Value Option 屬性和方法
Value Option 目前有一個屬性:Value
。 如果叫用此屬性時不存在任何值,則會引發 InvalidOperationException。
Value Option 函式
FSharp.Core 中的 ValueOption
模組包含了與 Option
模組相等的功能。 名稱上有一些差異,例如 defaultValueArg
:
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
這個的作用就像在 Option
模組中的 defaultArg
一樣,但只是改在 Value Option 上運作而已。