Параметры значений
Тип параметра "Значение" в 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
В настоящее время существует одно свойство для параметров значения: Value
Вызывается InvalidOperationException , если значение отсутствует при вызове этого свойства.
Функции параметра значения
Модуль ValueOption
в FSharp.Core содержит эквивалентные Option
функциональные возможности модуля. Существует несколько различий в имени, таких как defaultValueArg
:
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
Это действует так же, как defaultArg
и в модуле Option
, но работает с параметром "Значение".