F#では、型を持ち、定義できるものはすべて_値_と呼ばれます。これには真偽値、整数、配列だけでなく、関数も含まれます。整数値は1つ以上の(連続した)数字として定義され、標準の数学演算子をサポートします。
値に名前を割り当てることを_バインディング_と呼びます。バインディングはイミュータブルであり、そのため他の言語の定数に似ています。バインディングはletキーワードを使って定義します。
F#は静的型付け言語なので、各バインディングには型があります。ほとんどのバインディングでは型を指定する必要はありません。F#の_型推論_が、通常はその値から型を推論できるからです。
// Automatically inferred type
let fingers = 10
関数も通常のバインディングですが、1つ以上の仮引数を持ちます。関数は最後の式を自動的に返します。型推論はほとんどの関数でも機能し、その関数がどんな値で呼び出され、どんな値を返すかを分析します。
// Automatically inferred types for parameters and return type
let add x y = x + y
関数を呼び出すには、関数名を指定し、その関数の各仮引数に引数を渡します。
let five = add 2 3
バインディングの型を推論できない場合、コンパイラーはエラーを報告します。これを解決するには、バインディングの型を明示します。
// Explicit type annotation
let fingers: int = 10
// Explicit type annotation (also for parameters)
let add (x: int) (y: int): int = x + y
F#のバインディングは、定義した_後_でなければ使えません。定義する前にバインディングを使うと、コンパイルエラーになります。
// Compile error as the add binding has not yet been defined
// let seven = add 3 + 4
let add x y = x + y
スコープの定義には有意な空白を使います。バインディングを宣言する行を基準にして、スペースでコードをインデントします。既定の規則では、インデントにスペース4つを使います。
let toes =
let left = 5
let right = 5
left + right
let multiplyPlusTwo x y =
let product = x * y
product + 2
// Trying to access the left, right or product bindings
// here would result in a compile error
F#のバインディング(関数も含まれます)は、通常はモジュールにまとめられます。モジュールは関連する機能をグループ化するもので、moduleキーワードを使って定義します。モジュールの定義は、そのバインディングより前に置く必要があります。
module Calculator
let pi = 3.14
let add x y = x + y
F#は2種類のコメントをサポートしています。単一行コメントは//で始まり、複数行コメントは(*と*)の間に書きます。