このトピックでは、F# コンパイラが値、変数、パラメーター、戻り値の型を推論する方法について説明します。
一般的な型推論
型推論の考え方は、コンパイラが最終的に型を推測できない場合を除き、F# コンストラクトの型を指定する必要がないということです。 明示的な型情報を省略しても、F# が動的に型指定された言語であるか、F# の値が弱く型指定されているわけではありません。 F# は静的に型指定された言語です。つまり、コンパイラはコンパイル時に各コンストラクトの正確な型を取得します。 コンパイラが各コンストラクトの型を推測するのに十分な情報がない場合は、追加の型情報を指定する必要があります。通常は、コード内のどこかに明示的な型注釈を追加します。
パラメーターと戻り値の型の推論
パラメーター リストでは、各パラメーターの型を指定する必要はありません。 ただし、F# は静的に型指定された言語であるため、すべての値と式にはコンパイル時に明確な型があります。 明示的に指定しない型の場合、コンパイラはコンテキストに基づいて型を推論します。 型が指定されていない場合は、ジェネリックとして推論されます。 コードが値を一貫性なく使用する場合、値のすべての使用を満たす推論された型が 1 つも存在しない場合、コンパイラはエラーを報告します。
関数の戻り値の型は、関数内の最後の式の型によって決まります。
たとえば、次のコードでは、パラメーターの型a
とb
、および戻り値の型はすべて、リテラル 100
がint
型であるため、int
と推定されます。
let f a b = a + b + 100
リテラルを変更することで、型の推論に影響を与えることができます。 サフィックスu
を追加して100
をuint32
にすると、a
、b
、戻り値の型がuint32
と推定されます。
また、特定の型でのみ動作する関数やメソッドなど、型の制限を示す他のコンストラクトを使用して、型の推論に影響を与えることもできます。
また、次の例に示すように、関数またはメソッドのパラメーター、または式の変数に明示的な型注釈を適用することもできます。 異なる制約間で競合が発生すると、エラーが発生します。
// Type annotations on a parameter.
let addu1 (x : uint32) y =
x + y
// Type annotations on an expression.
let addu2 x y =
(x : uint32) + y
また、すべてのパラメーターの後に型注釈を指定することで、関数の戻り値を明示的に指定することもできます。
let addu1 x y : uint32 =
x + y
パラメーターで型注釈が役立つ一般的なケースは、パラメーターがオブジェクト型であり、メンバーを使用する場合です。
let replace(str: string) =
str.Replace("A", "a")
自動一般化
関数コードがパラメーターの型に依存していない場合、コンパイラはパラメーターをジェネリックと見なします。 これは 自動一般化と呼ばれ、複雑さを増すことなくジェネリック コードを記述するための強力な支援となります。
たとえば、次の関数は、任意の型の 2 つのパラメーターをタプルに結合します。
let makeTuple a b = (a, b)
型は
'a -> 'b -> 'a * 'b
追加情報
型推論の詳細については、F# 言語仕様を参照してください。
こちらも参照ください
.NET