オプションOptions

の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.

RemarksRemarks

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

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

ご覧のように、入力aSome(a) 0 より大きい場合はが生成されます。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 trueNoneは、次の関数のように、パターンマッチングにexists役立ちます。この関数は、オプションに値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が正常にNone開かFileれた場合にオブジェクトを返し、例外が発生した場合にはオブジェクトを返すため、型があります。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 Some場合は、または null の値を渡すこともできます。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 種類Type 説明Description
NoneNone 'T option None値を持つオプション値を作成できるようにする静的プロパティ。A static property that enables you to create an option value that has the None value.
IsNoneIsNone bool オプションtrueNone値がある場合は、を返します。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 値がではないNoneオプションを作成する静的メンバー。A static member that creates an option that has a value that is not None.
[値]Value '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.exists Option.foldBackにはOption.fold、、、 、、Option.count、、およびがあります。 Option.forallThese 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