F# の Value Option 型は、次の 2 つの状況が発生した場合に使用されます。
- 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!"
Options と同様に、ValueOption
を返す関数の名前付け規則は、try
でプレフィックスを付けます。
Value Option のプロパティとメソッド
現時点では、値オプションには 1 つのプロパティ ( Value
) があります。 このプロパティが呼び出されたときに値が存在しない場合は、 InvalidOperationException が発生します。
Value Option 関数
FSharp.Core の ValueOption
モジュールには、 Option
モジュールと同等の機能が含まれています。
defaultValueArg
など、名前にはいくつかの違いがあります。
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
これは、Option
モジュールのdefaultArg
と同じように機能しますが、代わりに Value オプションで動作します。
こちらも参照ください
.NET