值选项

以下两种情况保留时,使用 F# 中的值选项类型:

  1. 方案适用于 F# 选项
  2. 使用结构在方案中提供性能优势。

并非所有性能敏感的方案都是使用结构“解决的”。 使用它们而不是引用类型时,必须考虑复制的额外成本。 但是,大型 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!"

Options 一样,返回 ValueOption 的函数的命名约定是为其 try添加前缀。

值选项属性和方法

此时,值选项有一个属性: Value。 如果在调用此属性时不存在任何值,则会引发一个 InvalidOperationException 值。

值选项函数

ValueOption FSharp.Core 中的模块包含与Option模块等效的功能。 名称存在一些差异,例如 defaultValueArg

val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T

这就像在模块中Option一样defaultArg,而是对值选项进行作。

另请参阅