F# の値は、特定の型を持つ数量です。値は、整数または浮動小数点数、文字またはテキスト、リスト、シーケンス、配列、タプル、判別共用体、レコード、クラス型、関数値のいずれかです。

値のバインド

バインド とは、名前と定義を関連付けることを意味します。 let キーワードは、次の例のように、値のバインディングを行います。

let a = 1
let b = 100u
let str = "text"

// A function value binding.

let f x = x + 1

値の型は、定義から推論されます。 整数や浮動小数点数などのプリミティブ型では、型がリテラルの型から判断されます。 したがって、前の例では、コンパイラによって b の型が unsigned int と推論されるのに対し、a の型は int と推論されます。 関数値の型は、関数本体の戻り値から判断されます。 関数値の型の詳細については、「関数」を参照してください。 リテラルの型の詳細については、「Literals」を参照してください。

既定では、未使用のバインドに関する診断はコンパイラによって発行されません。 これらのメッセージを受け取るには、プロジェクト ファイルで、またはコンパイラを呼び出すときに (「コンパイラ オプション」の「--warnon」を参照)、警告 1182 を有効にします。

変更不可である理由

変更不可の値とは、プログラムの実行過程全体を通じて変更できない値です。 C++、Visual Basic、C# などの言語に慣れている場合は、F# のプログラムの実行中に、新しい値の割り当てが可能な変数よりも、変更不可な値が優先されることが意外に思われる可能性があります。 変更不可のデータは、関数型プログラミングの重要な要素です。 マルチスレッド環境では、多数の異なるスレッドによる変更が可能な共有の変数を管理することは困難です。 また、変更可能な変数では、変数が別の関数に渡されたときに変更される可能性があるかどうかを見分けるのが難しい場合があります。

純粋な関数型言語では、変数は存在せず、関数は数学関数として厳密に機能します。 手続き型言語のコードでは変数割り当てを使用して値を変更しますが、関数型言語の同等のコードには、入力である変更不可の値、変更不可の関数、および出力としての別の変更不可の値があります。 この数学的な厳密性により、プログラムの動作についての強力な推論が実現します。 この強力な推論により、コンパイラでコードをより厳密にチェックし、より効率的に最適化を行い、開発者が正しいコードを容易に理解および記述できるようになります。 したがって、関数型コードは、通常の手続き型コードよりもデバッグが容易になるのが普通です。

F# は、純粋な関数型言語ではありませんが、関数型プログラミングを完全にサポートします。 変更不可の値の使用は、コードで関数型プログラミングの重要な特長を利用できる、優れたプログラミング方法です。

変更可能な変数

キーワード mutable を使用して、変更可能な変数を指定できます。 F# での変更可能な変数の範囲は、通常、型のフィールドまたはローカル値として限定されています。 範囲が限定された変更可能な変数は、制御が容易であり、誤った方法で変更される可能性が低くなります。

変更可能な変数に初期値を割り当てるには、値を定義するときと同じ方法で、let キーワードを使用します。 ただし、次の例に示すように、<- 演算子を使用して、変更可能な変数に後で新しい値を割り当てることができる点が異なります。

let mutable x = 1
x <- x + 1

mutable としてマークされた値は、クロージャによってキャプチャされた場合 (seq ビルダーなど、クロージャを作成する形式を含みます)、'a ref に自動的に昇格されることがあります。 これが発生したときに通知を受け取るには、プロジェクト ファイルで、またはコンパイラを呼び出すときに、警告 3180 を有効にします。

Title 説明
let 束縛 let キーワードを使用した値および関数への名前のバインディングに関する情報を提供します。
関数 F# の関数の概要を説明します。

関連項目