值选项

在以下两种情况下,使用 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!"

选项一样,返回 ValueOption 的函数的命名约定是使用 try 作为前缀。

值选项属性和方法

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

值选项函数

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

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

这与 Option 模块中的 defaultArg 的作用类似,但改为对值选项进行操作。

另请参阅