當下列兩種情況保留時,會使用 F# 中的 Value Option 類型:
- 案例適用於 F# 選項。
- 使用結構可在您的案例中提供效能優勢。
並非所有區分效能的案例都會使用 結構來「解決」。 使用它們時,您必須考慮複製的額外成本,而不是參考型別。 不過,大型 F# 程式通常會具現化許多可流經經常性路徑的選擇性類型,在這種情況下,結構通常會在程式的存留期內產生更佳的整體效能。
定義
Value Option 定義為結構 歧視聯集 ,類似於參考選項類型。 其定義可以這樣想:
[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
| ValueNone
| ValueSome of 'T
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。
InvalidOperationException如果叫用這個屬性時沒有值,就會引發 。
值選項函式
ValueOption FSharp.Core 中的模組包含與模組相等的功能Option。 名稱有一些差異,例如 defaultValueArg:
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
這就像在模組中Option一樣defaultArg,但會改用值選項。