値のオプション

F# の Value Option 型は、次の 2 つの状況で使用されます。

  1. あるシナリオが F# Option に適切です。
  2. 構造体を使用すると、シナリオにおいてパフォーマンス上の利点が得られます。

パフォーマンスを重視するシナリオのすべてが、構造体を使用して "解決" されることはありません。 それらを参照型の代わりに使用するとき、コピーにかかる追加コストを考慮する必要があります。 ただし、大きな F# プログラムでは一般的に、ホット パスを流れるさまざまなオプションの型がインスタンス化されます。そのような場合、構造体はしばしば、プログラムの有効期間中、全体的なパフォーマンスを改善できます。

定義

Value Option は、参照オプション型に似た構造体の判別共用体として定義されます。 その定義は次のように考えることができます。

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

Value Option は、構造的な同等性と比較に準拠します。 主な違いは、コンパイル後の名前、型の名前、ケース名がすべて、それが値の型であることを示すということです。

Value Option を使用する

Value Option は、Option と同じように使用されます。 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!"

Option と同様に、ValueOption を返す関数の命名規則は try でプレフィックスを付けるというものです。

Value Option のプロパティとメソッド

現時点では、Value Option にはプロパティが 1 つあります。Value です。 このプロパティが呼び出されたとき、値が存在しない場合、InvalidOperationException が発生します。

Value Option 関数

FSharp.Core の ValueOption モジュールには、Option モジュールと等しい機能性が含まれています。 defaultValueArg のように、名前にいくつかの違いがあります。

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

これは OptiondefaultArg と同じように動作しますが、代わりに Value Option を操作します。

関連項目