型推論Type Inference

このトピックでは、F# コンパイラが値、変数、パラメーターおよび戻り値の型を推論する方法について説明します。This topic describes how the F# compiler infers the types of values, variables, parameters and return values.

一般的な型の推定Type Inference in General

型の推論という考え方は、F# の構成要素と、コンパイラには、型が推測できません増やした以外の種類を指定する必要はありません。The idea of type inference is that you do not have to specify the types of F# constructs except when the compiler cannot conclusively deduce the type. F# は動的に型指定された言語に、F# での値が所有権が弱い型指定された、明示的な型情報を省略することは限りません。Omitting explicit type information does not mean that F# is a dynamically typed language or that values in F# are weakly typed. F#は静的に型指定された言語です。つまり、コンパイラはコンパイル時に各コンストラクトに対して正確な型を推測します。F# is a statically typed language, which means that the compiler deduces an exact type for each construct during compilation. コンパイラが各コンストラクトの型を推測するのに十分な情報がない場合は、追加の型情報を指定する必要があります。通常は、コードのどこかに明示的な型の注釈を追加します。If there is not enough information for the compiler to deduce the types of each construct, you must supply additional type information, typically by adding explicit type annotations somewhere in the code.

パラメーターと戻り値の型の推論Inference of Parameter and Return Types

パラメーターリストでは、各パラメーターの型を指定する必要はありません。In a parameter list, you do not have to specify the type of each parameter. さらに、 F#は静的に型指定された言語であるため、すべての値と式はコンパイル時に明確な型になります。And yet, F# is a statically typed language, and therefore every value and expression has a definite type at compile time. 明示的に指定しない型については、コンパイラはコンテキストに基づいて型を推測します。For those types that you do not specify explicitly, the compiler infers the type based on the context. 型が指定されていない場合は、ジェネリックであると推論されます。If the type is not otherwise specified, it is inferred to be generic. コードで値が一貫して使用されていない場合、値のすべての使用を満たす1つの推論された型が存在しないようにすると、コンパイラはエラーを報告します。If the code uses a value inconsistently, in such a way that there is no single inferred type that satisfies all the uses of a value, the compiler reports an error.

関数の戻り値の型は、関数内の最後の式の型によって決まります。The return type of a function is determined by the type of the last expression in the function.

たとえば、次のコードでは、 aリテラル100の型intbintあるため、パラメーターの型と戻り値の型はすべて、として推論されます。For example, in the following code, the parameter types a and b and the return type are all inferred to be int because the literal 100 is of type int.

let f a b = a + b + 100

リテラルを変更することで、型の推定に影響を与えることができます。You can influence type inference by changing the literals. サフィックス100 a uint32 bを追加してuint32を作成した場合、、、およびの戻り値の型はと推論されます。 uIf you make the 100 a uint32 by appending the suffix u, the types of a, b, and the return value are inferred to be uint32.

特定の型のみを使用する関数やメソッドなど、型に制限がある他の構造体を使用して型の推定に影響を与えることもできます。You can also influence type inference by using other constructs that imply restrictions on the type, such as functions and methods that work with only a particular type.

また、次の例に示すように、関数またはメソッドのパラメーターまたは式の変数に明示的な型の注釈を適用することもできます。Also, you can apply explicit type annotations to function or method parameters or to variables in expressions, as shown in the following examples. 異なる制約の間で競合が発生すると、エラーが発生します。Errors result if conflicts occur between different constraints.

// Type annotations on a parameter.
let addu1 (x : uint32) y =
    x + y

// Type annotations on an expression.
let addu2 x y =
    (x : uint32) + y

また、すべてのパラメーターの後に型の注釈を指定することで、関数の戻り値を明示的に指定することもできます。You can also explicitly specify the return value of a function by providing a type annotation after all the parameters.

let addu1 x y : uint32 =
   x + y

パラメーターで型の注釈が役立つ一般的なケースは、パラメーターがオブジェクト型で、メンバーを使用する場合です。A common case where a type annotation is useful on a parameter is when the parameter is an object type and you want to use a member.

let replace(str: string) =
    str.Replace("A", "a")

自動ジェネリック化Automatic Generalization

関数コードがパラメーターの型に依存していない場合、コンパイラはパラメーターをジェネリックと見なします。If the function code is not dependent on the type of a parameter, the compiler considers the parameter to be generic. これは自動汎化と呼ばれ、複雑さを増すことなく汎用コードを記述するための強力な機能となります。This is called automatic generalization, and it can be a powerful aid to writing generic code without increasing complexity.

たとえば、次の関数は、任意の型の2つのパラメーターを組に結合します。For example, the following function combines two parameters of any type into a tuple.

let makeTuple a b = (a, b)

型は、として推論されます。The type is inferred to be

'a -> 'b -> 'a * 'b

追加情報Additional Information

型の推定については、F# 言語仕様で詳しく説明します。Type inference is described in more detail in the F# Language Specification.

関連項目See also