次の方法で共有


値のオプション

F# の Value Option 型は、次の 2 つの状況が発生した場合に使用されます。

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

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 オプションで動作します。

こちらも参照ください