Opciones de valores

El tipo de Opción de valor en F# se usa cuando se dan estas dos circunstancias:

  1. El escenario es adecuado para una opción de F#.
  2. El uso de struct proporciona una ventaja de rendimiento en el escenario.

No todos los escenarios sensibles al rendimiento se "resuelven" mediante structs. Debe tener en cuenta el coste adicional de las copias al usar structs en vez de tipos de referencia. Sin embargo, los programas de F# de gran tamaño suelen crear instancias de muchos tipos opcionales que fluyen a través de rutas de acceso activas y, en tales casos, los structs pueden dar a menudo un mejor rendimiento general durante la duración de un programa.

Definición

Una Opción de valor se define como una unión discriminada por structs similar al tipo de opción de referencia. Se puede definir de esta manera:

[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
    | ValueNone
    | ValueSome of 'T

Una Opción de valor se ajusta a la igualdad estructural y a la comparación. La principal diferencia es que el nombre compilado, el nombre del tipo y los nombres de los casos indican que es un tipo de valor.

Usar Opciones de valor

Las Opciones de valor se usan igual que las Opciones. ValueSome se usa para indicar que un valor está presente y ValueNone se usa cuando un valor no está presente:

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!"

Al igual que con las Opciones, la convención de nomenclatura de una función que devuelve ValueOption es usar try como su prefijo.

Propiedades y métodos de las Opciones de valor

Hay una propiedad para las Opciones de valor en este momento: Value. Se genera InvalidOperationException si no hay ningún valor cuando se invoca esta propiedad.

Funciones de las Opciones de valor

El módulo ValueOption de FSharp.Core contiene una funcionalidad equivalente al módulo Option. Hay algunas diferencias a priori, como defaultValueArg:

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

Esto funciona como defaultArg en el módulo Option, pero operando en una Opción de valor.

Consulte también