型推論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.

たとえば、次のコードでは、パラメーターの型でabおよび戻り値の型はすべてに推定intためリテラル100の種類はintします。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. 行った場合、 100uint32 、サフィックスが追加されたu、種類のab、および戻り値が推論されますuint32If 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