OptionsOptions

F # のオプションの種類は、名前付きの値または変数に実際の値が存在しない可能性がある場合に使用されます。The option type in F# is used when an actual value might not exist for a named value or variable. オプションには基になる型があり、その型の値を保持できるか、値がない可能性があります。An option has an underlying type and can hold a value of that type, or it might not have a value.

注釈Remarks

次のコードは、オプションの型を生成する関数を示しています。The following code illustrates a function which generates an option type.

let keepIfPositive (a : int) = if a > 0 then Some(a) else None

ご覧のように、入力 a が0より大きい場合 Some(a) はが生成されます。As you can see, if the input a is greater than 0, Some(a) is generated. それ以外の場合 None は、が生成されます。Otherwise, None is generated.

None は、オプションに実際の値がない場合に使用されます。The value None is used when an option does not have an actual value. それ以外の場合、この式は Some( ... ) オプションに値を与えます。Otherwise, the expression Some( ... ) gives the option a value. Some とは、次の関数のように、 None パターンマッチングに役立ち exists true ます。この関数は、オプションに値がある場合はを返し、そうでない場合はを返し false ます。The values Some and None are useful in pattern matching, as in the following function exists, which returns true if the option has a value and false if it does not.

let exists (x : int option) =
    match x with
    | Some(x) -> true
    | None -> false

オプションを使用するUsing Options

オプションは、次のコードに示すように、検索で一致する結果が返されない場合によく使用されます。Options are commonly used when a search does not return a matching result, as shown in the following code.

let rec tryFindMatch pred list =
    match list with
    | head :: tail -> if pred(head)
                        then Some(head)
                        else tryFindMatch pred tail
    | [] -> None

// result1 is Some 100 and its type is int option.
let result1 = tryFindMatch (fun elem -> elem = 100) [ 200; 100; 50; 25 ]

// result2 is None and its type is int option.
let result2 = tryFindMatch (fun elem -> elem = 26) [ 200; 100; 50; 25 ]

前のコードでは、リストは再帰的に検索されます。In the previous code, a list is searched recursively. 関数は、 tryFindMatch pred ブール値と検索するリストを返す述語関数を受け取ります。The function tryFindMatch takes a predicate function pred that returns a Boolean value, and a list to search. 述語を満たす要素が見つかった場合、再帰は終了し、関数は式のオプションとして値を返し Some(head) ます。If an element that satisfies the predicate is found, the recursion ends and the function returns the value as an option in the expression Some(head). 空のリストが一致すると、再帰は終了します。The recursion ends when the empty list is matched. その時点では、値が見つからなかったため、 head None が返されます。At that point the value head has not been found, and None is returned.

コレクション内で存在する可能性がある値または存在しない可能性がある値を検索する多くの F # ライブラリ関数は、型を返し option ます。Many F# library functions that search a collection for a value that may or may not exist return the option type. 慣例により、これらの関数は、など try のプレフィックスで始まり Seq.tryFindIndex ます。By convention, these functions begin with the try prefix, for example, Seq.tryFindIndex.

オプションは、値が存在しない場合にも役立ちます。たとえば、値を構築しようとしたときに例外がスローされる可能性がある場合などです。Options can also be useful when a value might not exist, for example if it is possible that an exception will be thrown when you try to construct a value. これを次のコード例に示します。The following code example illustrates this.

open System.IO
let openFile filename =
    try
        let file = File.Open (filename, FileMode.Create)
        Some(file)
    with
        | ex -> eprintf "An exception occurred with message %s" ex.Message
                None

前の例の関数は、 openFile ファイルが正常に開かれた場合にオブジェクトを返し、例外が発生した場合には string -> File option オブジェクトを返すため、型があり File None ます。The openFile function in the previous example has type string -> File option because it returns a File object if the file opens successfully and None if an exception occurs. 状況によっては、伝達を許可するのではなく、例外をキャッチするための適切な設計選択ではない場合があります。Depending on the situation, it may not be an appropriate design choice to catch an exception rather than allowing it to propagate.

nullまた、オプションの場合は、または null の値を渡すこともでき Some ます。Additionally, it is still possible to pass null or a value that is null to the Some case of an option. 通常、これは回避され、通常はルーチン F # プログラミングで使用されますが、.NET の参照型の性質によって可能です。This is generally to be avoided, and typically is in routine F# programming, but is possible due to the nature of reference types in .NET.

オプションのプロパティとメソッドOption Properties and Methods

オプションの種類は、次のプロパティとメソッドをサポートしています。The option type supports the following properties and methods.

プロパティまたはメソッドProperty or method TypeType 説明Description
なしNone 'T option 値を持つオプション値を作成できるようにする静的プロパティ NoneA static property that enables you to create an option value that has the None value.
IsNoneIsNone bool trueオプションに値がある場合は、を返し None ます。Returns true if the option has the None value.
IsSomeIsSome bool オプションに以外の値がある場合は、を返し true None ます。Returns true if the option has a value that is not None.
一部Some 'T option 値がではないオプションを作成する静的メンバー NoneA static member that creates an option that has a value that is not None.
ValueValue 'T 基になる値を返すか、値がの場合はをスローし System.NullReferenceException None ます。Returns the underlying value, or throws a System.NullReferenceException if the value is None.

オプションモジュールOption Module

オプションに対して操作を実行する便利な関数を含むモジュールがあります。There is a module, Option, that contains useful functions that perform operations on options. 一部の関数はプロパティの機能を繰り返しますが、関数が必要なコンテキストで役に立ちます。Some functions repeat the functionality of the properties but are useful in contexts where a function is needed. IsNoneは、オプションが値を保持しているかどうかをテストするモジュール関数でもありますOption.isSome and Option.isNone are both module functions that test whether an option holds a value. オプション。 get は値を取得します (存在する場合)。Option.get obtains the value, if there is one. 値がない場合は、をスロー System.ArgumentException します。If there is no value, it throws System.ArgumentException.

値がある場合、 bind 関数は値に対して関数を実行します。The Option.bind function executes a function on the value, if there is a value. 関数は、引数を1つだけ受け取る必要があります。また、パラメーターの型は、オプションの型である必要があります。The function must take exactly one argument, and its parameter type must be the option type. 関数の戻り値は、もう1つのオプションの種類です。The return value of the function is another option type.

オプションモジュールには、リスト、配列、シーケンス、およびその他のコレクション型で使用できる関数に対応する関数も含まれています。The option module also includes functions that correspond to the functions that are available for lists, arrays, sequences, and other collection types. これらの関数には、、、、、、 Option.map Option.iter 、およびがあり Option.forall Option.exists Option.foldBack Option.fold Option.count ます。These functions include Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold, and Option.count. これらの関数は、0個または1個の要素のコレクションのようにオプションを使用できます。These functions enable options to be used like a collection of zero or one elements. 詳細と例については、コレクション関数の 一覧での説明を参照してください。For more information and examples, see the discussion of collection functions in Lists.

他の型への変換Converting to Other Types

オプションは、リストまたは配列に変換できます。Options can be converted to lists or arrays. オプションがこれらのデータ構造体のいずれかに変換されると、結果のデータ構造体には0個または1個の要素が含まれます。When an option is converted into either of these data structures, the resulting data structure has zero or one element. オプションを配列に変換するには、を使用し Option.toArray ます。To convert an option to an array, use Option.toArray. オプションを一覧に変換するには、を使用し Option.toList ます。To convert an option to a list, use Option.toList.

関連項目See also