值选项
在以下两种情况下,使用 F# 中的值选项类型:
- 方案适用于 F# 选项。
- 使用结构可在方案中提供性能优势。
并非所有对性能敏感的方案都可以通过使用结构来“解决”。 在使用这些结构而不是引用类型时,必须考虑复制的额外成本。 但是,大型 F# 程序通常会实例化许多通过热路径流动的可选类型,在这种情况下,结构通常可以在程序的整个生命周期内产生更好的整体性能。
定义
值选项定义为类似于引用选项类型的结构区分联合。 它的定义可以这样想:
[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
| ValueNone
| ValueSome of 'T
值选项符合结构相等性和比较。 主要区别在于编译名称、类型名称和大小写名都表明它是一个值类型。
使用值选项
值选项的使用方式与选项类似。 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!"
与选项一样,返回 ValueOption
的函数的命名约定是使用 try
作为前缀。
值选项属性和方法
此时值选项只有一个属性:Value
。 如果调用此属性时不存在任何值,则会引发 InvalidOperationException。
值选项函数
FSharp.Core 中的 ValueOption
模块包含与 Option
模块等效的功能。 名称上有一些差异,例如 defaultValueArg
:
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
这与 Option
模块中的 defaultArg
的作用类似,但改为对值选项进行操作。